Python微医挂号网医生数据抓取


Posted in Python onJanuary 24, 2019

1. 写在前面

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

首先找到 医生列表页

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

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

Python微医挂号网医生数据抓取

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()

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

数据清单:

Python微医挂号网医生数据抓取

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python中的列表知识点汇总
Apr 14 Python
编写Python的web框架中的Model的教程
Apr 29 Python
Python3遍历目录树实现方法
May 22 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
python3去掉string中的标点符号方法
Jan 22 Python
Django多数据库的实现过程详解
Aug 01 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
python实现抠图给证件照换背景源码
Aug 20 Python
Python StringIO如何在内存中读写str
Jan 07 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
Python日志syslog使用原理详解
Feb 18 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 #Python
几行Python代码爬取3000+上市公司的信息
Jan 24 #Python
python安装pywin32clipboard的操作方法
Jan 24 #Python
Python中extend和append的区别讲解
Jan 24 #Python
对python pandas读取剪贴板内容的方法详解
Jan 24 #Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 #Python
Python使用post及get方式提交数据的实例
Jan 24 #Python
You might like
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python简单实现enum功能的方法
2016/04/25 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python中安装easy_install的方法
2018/11/18 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
如何在C# winform中异步调用web services
2015/09/21 面试题
文明之星事迹材料
2014/05/09 职场文书
雷锋电影观后感
2015/06/10 职场文书
初中毕业生感言
2015/07/31 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书