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实现远程调用MetaSploit的方法
Aug 22 Python
Python version 2.7 required, which was not found in the registry
Aug 26 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
Python单元测试与测试用例简析
Nov 09 Python
安装PyInstaller失败问题解决
Dec 14 Python
python打印n位数“水仙花数”(实例代码)
Dec 25 Python
python中列表的含义及用法
May 26 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
python matlab库简单用法讲解
Dec 31 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
Python Django框架介绍之模板标签及模板的继承
May 27 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
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
javascript forEach通用循环遍历方法
2010/10/11 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
深入理解Python中字典的键的使用
2015/08/19 Python
Python 打印中文字符的三种方法
2018/08/14 Python
Python中断多重循环的思路总结
2019/10/04 Python
python 怎样进行内存管理
2020/11/10 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
办公室主任先进事迹
2014/01/18 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
学校开除通知书
2015/04/25 职场文书
南京大屠杀观后感
2015/06/02 职场文书
爱国主义主题班会
2015/08/14 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang