首页 > 编程 > Python > 正文

Python微医挂号网医生数据抓取

2020-02-16 00:51:56
字体:
来源:转载
供稿:网友

1. 写在前面

今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做准备。本篇文章主要使用的库为pyppeteer 和 pyquery

首先找到 医生列表页

https://www.guahao.com/expert/all/全国/all/不限/p5 

这个页面显示有 75952 条数据 ,实际测试中,翻页到第38页,数据就加载不出来了,目测后台程序猿没有把数据返回,不过为了学习,我们忍了。

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 asynciofrom pyppeteer import launchasync 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 asynciofrom pyppeteer import launchclass 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()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表