如何抓取网页数据(【】爬取解析及使用方法分享)

优采云 发布时间: 2022-01-10 08:07

  如何抓取网页数据(【】爬取解析及使用方法分享)

  1. 写在前面

  今天要抓取的那个网站叫WeDoctor网站,地址是,我们会通过python3爬虫抓取这个URL,然后把数据存成CSV,为后面的一些分析教程做准备。本文文章主要用到的库是pyppeteer和pyquery

  首先找到医生列表页面

  全国/全部/无限/p5

  该页面显示有75952条数据。实际测试中,当翻到第38页时,无法加载数据。目测后台程序员并没有返回数据,但是为了学习,我们忍了。

  

  2. 页面网址

  全国/全部/无限/p1

  全国/全部/无限/p2

  ...

  全国/全部/无限/p38

  总数据超过38页,量不是很大。我们只需要选择一个库来抓取它。对于这个博客,我发现了一个不受欢迎的库。

  在使用pyppeteer的过程中,发现资料很少,非常尴尬。而且官方文档写的不是很好,有兴趣的可以自己看一下。这个库的安装也在下面的 URL 中。

  最简单的使用方法也简单写在官方文档中,如下,可以直接将网页保存为图片。

  

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()

  综上所述,这个库不是很容易使用。以前可能没有仔细研究过。感觉很正常。你可以多尝试一下,看看是否能提高整体效率。

  资料清单:

  

  总结

  以上就是这个文章的全部内容。希望本文的内容对您的学习或工作有一定的参考和学习价值。谢谢您的支持。如果您想了解更多信息,请查看下面的相关链接

  相关文章

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线