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 开发者节省时间的10个方法
Oct 02 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
python集合常见运算案例解析
Oct 17 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
通过实例简单了解python yield使用方法
Aug 06 Python
python使用建议与技巧分享(一)
Aug 17 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
Matplotlib中rcParams使用方法
Jan 05 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
艺术设计专业个人求职信
2013/09/21 职场文书
技校教师求职简历的自我评价
2013/10/20 职场文书
个人查摆剖析材料
2014/02/04 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
《石榴》教学反思
2014/03/02 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
Python Django模型详解
2021/10/05 Python
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
python缺失值填充方法示例代码
2022/12/24 Python