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 24 Python
numpy中的高维数组转置实例
Apr 17 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
Python动态生成多维数组的方法示例
Aug 09 Python
用Python实现大文本文件切割的方法
Jan 12 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
基于Tensorflow一维卷积用法详解
May 22 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 Python
Python类class参数self原理解析
Nov 19 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
Mootools 1.2教程 类(一)
2009/09/15 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
JavaScript实现简单评论功能
2017/08/17 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
下载糗事百科的内容_python版
2008/12/07 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
python django生成迁移文件的实例
2019/08/31 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
学习Python列表的基础知识汇总
2020/03/10 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
创意活动策划书
2014/01/15 职场文书
护理工作感言
2014/01/16 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
踏青活动策划方案
2014/08/19 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
2014年德育工作总结
2014/11/20 职场文书
聘任证明怎么写
2015/03/02 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android