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 计算两个日期相差多少个月实例代码
May 24 Python
Python subprocess模块详细解读
Jan 29 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
python的常用模块之collections模块详解
Dec 06 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
pycharm无法导入lxml的解决办法
Mar 31 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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
杏林同学录(三)
2006/10/09 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
javascript 验证日期的函数
2010/03/18 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python操作SQLite数据库的方法详解
2017/06/16 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
如何利用find命令查找文件
2015/02/07 面试题
简历自荐信
2013/12/02 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
升学宴祝酒词
2015/08/11 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书