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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
跟老齐学Python之深入变量和引用对象
Sep 24 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
如何利用Python识别图片中的文字
May 31 Python
keras多显卡训练方式
Jun 10 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
Python中全局变量和局部变量的理解与区别
Feb 07 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
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
php的大小写敏感问题整理
2011/12/29 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
php微信开发之关注事件
2018/06/14 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
angularJS 入门基础
2015/02/09 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
Python 音频生成器的实现示例
2019/12/24 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
ECHT官方网站:男女健身服
2020/02/14 全球购物
网络工程师职业规划
2014/02/10 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
大学班级计划书
2014/04/29 职场文书
政府信息公开实施方案
2014/05/09 职场文书
节能环保口号
2014/06/12 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
springboot入门 之profile设置方式
2022/04/04 Java/Android