如何抓取网页数据(【】爬取解析及使用方法分享)
优采云 发布时间: 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()
综上所述,这个库不是很容易使用。以前可能没有仔细研究过。感觉很正常。你可以多尝试一下,看看是否能提高整体效率。
资料清单:
总结
以上就是这个文章的全部内容。希望本文的内容对您的学习或工作有一定的参考和学习价值。谢谢您的支持。如果您想了解更多信息,请查看下面的相关链接
相关文章