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对内存的使用(深浅拷贝)
Jan 17 Python
python实现简单遗传算法
Mar 19 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
Python 异步协程函数原理及实例详解
Nov 13 Python
opencv3/C++ 平面对象识别&透视变换方式
Dec 11 Python
python下载的库包存放路径
Jul 27 Python
django跳转页面传参的实现
Sep 17 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
如何使用Python实现一个简易的ORM模型
May 12 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
Protoss热键控制
2020/03/14 星际争霸
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Django 实现下载文件功能的示例
2018/03/06 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python manage.py runserver流程解析
2019/11/08 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
模具专业推荐信
2013/10/30 职场文书
网管求职信
2014/03/03 职场文书
岗位说明书范文
2014/05/07 职场文书
医师定期考核实施方案
2014/05/07 职场文书
环保倡议书300字
2014/05/15 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
中学团支部工作总结
2015/08/13 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL
Python代码实现双链表
2022/05/25 Python