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

相关文章
|
15天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
22小时前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
5天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
13天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
17天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
20天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
18天前
|
数据采集 JavaScript 前端开发
Python爬虫能处理动态加载的内容吗?
Python爬虫可处理动态加载内容,主要方法包括:使用Selenium模拟浏览器行为;分析网络请求,直接请求API获取数据;利用Pyppeteer控制无头Chrome。这些方法各有优势,适用于不同场景。
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
98 6
|
1月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
66 4
|
4月前
|
数据采集 存储 中间件
Python进行网络爬虫:Scrapy框架的实践
【8月更文挑战第17天】网络爬虫是自动化程序,用于从互联网收集信息。Python凭借其丰富的库和框架成为构建爬虫的首选语言。Scrapy作为一款流行的开源框架,简化了爬虫开发过程。本文介绍如何使用Python和Scrapy构建简单爬虫:首先安装Scrapy,接着创建新项目并定义爬虫,指定起始URL和解析逻辑。运行爬虫可将数据保存为JSON文件或存储到数据库。此外,Scrapy支持高级功能如中间件定制、分布式爬取、动态页面渲染等。在实践中需遵循最佳规范,如尊重robots.txt协议、合理设置爬取速度等。通过本文,读者将掌握Scrapy基础并了解如何高效地进行网络数据采集。
230 6