Python爬虫入门教程 24-100 微医挂号网医生数据抓取

简介: 1. 微医挂号网医生数据写在前面今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做准备。

1. 微医挂号网医生数据写在前面

今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做准备。本篇文章主要使用的库为pyppeteerpyquery

首先找到 医生列表页

https://www.guahao.com/expert/all/全国/all/不限/p5  

这个页面显示有 75952 条数据 ,实际测试中,翻页到第38页,数据就加载不出来了,目测后台程序猿没有把数据返回,不过为了学习,我们忍了。

image

2. 微医挂号网医生数据页面URL

https://www.guahao.com/expert/all/全国/all/不限/p1
https://www.guahao.com/expert/all/全国/all/不限/p2
...
https://www.guahao.com/expert/all/全国/all/不限/p38 

数据总过38页,量不是很大,咱只需要随便选择一个库抓取就行,这篇博客,我找了一个冷门的库
pyppeteer 在使用过程中,发现资料好少,很尴尬。而且官方的文档写的也不好,有兴趣的可以自行去看看。关于这个库的安装也在下面的网址中。

https://miyakogi.github.io/pyppeteer/index.html

最简单的使用方法,在官方文档中也简单的写了一下,如下,可以把一个网页直接保存为一张图片。

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()  # 运行一个无头的浏览器
    page = await browser.newPage()  # 打开一个选项卡
    await page.goto('http://www.baidu.com')  # 加载一个页面
    await page.screenshot({'path': 'baidu.png'})  # 把网页生成截图
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())  # 异步

我整理了下面的一些参考代码,你可以 做一些参考。

browser = await launch(headless=False)  # 可以打开浏览器
await page.click('#login_user')  # 点击一个按钮
await page.type('#login_user', 'admin')  # 输入内容

await page.click('#password')  
await page.type('#password', '123456')

await page.click('#login-submit')

await page.waitForNavigation()  

# 设置浏览器窗口大小
await page.setViewport({
    'width': 1350,
    'height': 850
})

content = await page.content()  # 获取网页内容
cookies = await page.cookies()  # 获取网页cookies

3. 微医挂号网医生数据-爬取页面

运行下面的代码,你就可以看到控制台不断的打印网页的源码,只要获取到源码,就可以进行后面的解析与保存数据了。如果出现控制不输出任何东西的情况,那么请把下面的
await launch(headless=True) 修改为 await launch(headless=False)

import asyncio
from pyppeteer import launch


class DoctorSpider(object):
    async def main(self, num):
        try:
            browser = await launch(headless=True)
            page = await browser.newPage()

            print(f"正在爬取第 {num} 页面")
            await page.goto("https://www.guahao.com/expert/all/全国/all/不限/p{}".format(num))

            content = await page.content()
            print(content)

        except Exception as e:
            print(e.args)

        finally:
            num += 1
            await browser.close()
            await self.main(num)


    def run(self):
        loop = asyncio.get_event_loop()
        asyncio.get_event_loop().run_until_complete(self.main(1))


if __name__ == '__main__':
    doctor = DoctorSpider()
    doctor.run()

4. 微医挂号网医生数据-解析数据

解析数据采用的是pyquery ,这个库在之前的博客中有过使用,直接应用到案例中即可。最终产生的数据通过pandas保存到CSV文件中。

import asyncio

from pyppeteer import launch
from pyquery import PyQuery as pq
import pandas as pd  # 保存csv文件

class DoctorSpider(object):

    def __init__(self):
        self._data = list()

    async def main(self,num):

        try:

            browser = await launch(headless=True)
            page = await browser.newPage()

            print(f"正在爬取第 {num} 页面")
            await page.goto("https://www.guahao.com/expert/all/全国/all/不限/p{}".format(num))
            content = await page.content()

            self.parse_html(content)
            print("正在存储数据....")

            data = pd.DataFrame(self._data)
            data.to_csv("微医数据.csv", encoding='utf_8_sig')
        except Exception as e:
            print(e.args)
        finally:
            num+=1

            await browser.close()

            await self.main(num)
    def parse_html(self,content):

        doc = pq(content)

        items = doc(".g-doctor-item").items()
        for item in items:
            #doctor_name = item.find(".seo-anchor-text").text()
            name_level = item.find(".g-doc-baseinfo>dl>dt").text() # 姓名和级别
            department = item.find(".g-doc-baseinfo>dl>dd>p:eq(0)").text() # 科室
            address = item.find(".g-doc-baseinfo>dl>dd>p:eq(1)").text()  # 医院地址
            star = item.find(".star-count em").text()  # 评分
            inquisition = item.find(".star-count i").text() # 问诊量
            expert_team = item.find(".expert-team").text()  # 专家团队
            service_price_img = item.find(".service-name:eq(0)>.fee").text()
            service_price_video = item.find(".service-name:eq(1)>.fee").text()

            one_data = {
                "name": name_level.split(" ")[0],
                "level": name_level.split(" ")[1],
                "department": department,
                "address": address,
                "star": star,
                "inquisition": inquisition,
                "expert_team": expert_team,
                "service_price_img": service_price_img,
                "service_price_video": service_price_video
            }

            self._data.append(one_data)



    def run(self):
        loop = asyncio.get_event_loop()

        asyncio.get_event_loop().run_until_complete(self.main(1))



if __name__ == '__main__':

    doctor = DoctorSpider()
    doctor.run()

总结一下,这个库不怎么好用,可能之前没有细细的研究过,感觉一般,你可以在多尝试一下,看一下是否可以把整体的效率提高上去。

数据清单:
image

相关文章
|
13天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
17天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
22天前
|
存储 数据挖掘 数据库
【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
|
23天前
|
数据采集 安全 Python
python并发编程:Python实现生产者消费者爬虫
python并发编程:Python实现生产者消费者爬虫
24 0
python并发编程:Python实现生产者消费者爬虫
|
3天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
12 0
|
6天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
17天前
|
数据采集 存储 前端开发
Python爬虫如何快速入门
写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。
20 0
|
14天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
14天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
1天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程