如何使用pyppeteer抓取网页的数据(一)_百度搜索数据
优采云 发布时间: 2021-07-07 18:17如何使用pyppeteer抓取网页的数据(一)_百度搜索数据
今天,我们将介绍如何使用pyppeteer来获取网页数据。 Pyppeteer是一个Web应用自动化测试工具,可以直接在浏览器中运行,通过代码控制与页面元素进行交互,获取相应信息。
过去,我们通过编写代码来爬取数据。当待爬取的网站需要登录时,我们需要在代码中模拟登录;当抓取速度过快需要验证时,我们需要在代码中登录实现ip中的验证逻辑;当ip被阻塞时,你还需要有自己的动态ip库。我们爬取网站的反爬策略越多,我们爬取的成本就越大。总之,通过编写代码爬取数据需要构造更复杂的请求,并千方百计将爬虫伪装成真实用户。
使用pyppeteer之类的工具可以很大程度上解决以上问题。同时还有一个好处就是所见即所得,无需研究网页复杂的请求结构。当然,这类工具也有其优点和缺点。它增加了理解网页上各种元素和交互的成本。所以我觉得这类工具最适合用在短小、扁平、爬行速度快的场景。比如我在最近的工作中就遇到过两次这种情况。我想抓取一些特别简单的数据来提高工作效率,但我不想研究网页如何构建请求。您可以使用此 WYSIWYG 工具。快速抓取您想要的数据。
我们以“抓取百度搜索数据”为例,介绍一下pyppeteer的使用。在正式介绍之前,先来看看爬取效果:
安装pyppeteer
python3 -m pip install pyppeteer
安装完成后,执行pyppeteer-install命令安装最新版本的Chromium浏览器。根据官方文档,安装pyppeteer需要Python3.6或更高版本。
因为pyppeteer是基于asyncio实现的,所以我们在代码中也会使用async/await来写代码。没写过的朋友别着急。基本不会影响pyppeteer的使用。如有必要,我们将使用 async/await 来编写代码。写一篇文章的介绍。
首先用pyppeteer启动chrome进程
from pyppeteer import launch
# headless 显示浏览器
# --window-size 设置窗体大小
browser = await launch({'headless': False,
'args': ['--window-size=%d,%d' % (width, height)]
})
然后,打开一个新标签并访问百度
# 打开新页面
page = await browser.newPage()
# 设置内容显示大小
await page.setViewport({"width": width, "height": height})
# 访问百度
await page.goto('https://www.baidu.com')
打开百度网站后,下一步就是在搜索输入框中输入内容,首先找到输入框的html标签
从上图可以看出,代码代表搜索输入框,标签的类是s_ipt,然后我们会通过type函数找到标签,输入要搜索的内容。
# 将对应的 selector 填入 python,通过.s_ipt找到输入框html标签
await page.type('.s_ipt', 'python')
这里我们搜索的是python。输入后,您可以点击“百度”按钮开始搜索。查找按钮的方法同上
可以看到代码代表“百度点击”的按钮。标签的 id 是 su。现在调用点击函数找到标签,然后点击
# 通过#su找到“百度一下”按钮html标签
await page.click('#su')
需要注意的是su的前面是#而不是.,因为它在html标签中是用id而不是class来表示的。它涉及到html选择器的内容。如果你不知道,你可以简单地添加它。
执行上述代码后,可以看到搜索结果,调用截图方法保存当前页面
await page.screenshot({'path': 'example.png'})
效果如下:
接下来,我们将获取网页的内容并解析每个结果
# 获取网页内容
content = await page.content()
# 解析
output_search_result(content)
通过BeatifulSoup分析每个结果的标题和链接
def output_search_result(html):
search_bs = BeautifulSoup(html, 'lxml')
all_result = search_bs.find_all("div", {'class': "result c-container"})
for single_res in all_result:
title_bs = single_res.find("a")
title_url = title_bs.get('href')
title_txt = title_bs.get_text()
print(title_txt, title_url)
输出内容如下
python官方网站 - Welcome to Python.org http://www.baidu.com/link?url=OqtoElo8HW1GdOgAlqdCTz2lpewFLf0HlbnGdyAKD06BfPbw0fsJ_N5fclxx-q1D
Python 基础教程 | 菜鸟教程 http://www.baidu.com/link?url=IooFgJjdec1qPXhGhF7tur-z2Qt_43RkK3L-9cp8oB-0i2w7unKzLayLjg3zSQeKQieA49JFejMjqTM-TSY3V_
Python3 * 和 ** 运算符_python_极客点儿-CSDN博客 http://www.baidu.com/link?url=H3VdAQRAbTkN9jGJGkvhIFTdg48O-b5yib7vCquWyg1-6FZwBVHnJ5iiUYQkjbf-8IuLfOwDXoUMDOdMvXNHkzejts4uRHrczgQqekgQuFy
Python教程 - 廖雪峰的官方网站 http://www.baidu.com/link?url=piu0nEfXNvkLhWchcdX2EjJvIkQ5beq2_uYH_B7u2vjYO82BZwr8SXgDxnVLZYgGL8xuR_ovjg2cAYfPS9AmLtqUQP-TrWuJWHNqYbxdQnUPTy_VPp8sSBdCaYBl9YDX
Python3 教程 | 菜鸟教程 http://www.baidu.com/link?url=bx1rMrzxC69Sp0zY08-VhFs40QQ8UFxZdvmZVFcKYkCG2mdojhAMjk5ulKBKwQm77x8vMyOeowW_bNtoP35m3q
你都用 Python 来做什么? - 知乎 http://www.baidu.com/link?url=YTMr1ycFjtkWx8lgJ_PT3-kF50vYI6Yibh4o69WL_afBSOkkZmGxexxIKXY3fGAX8X2-AaFbI4jL1vJbKMJrsK
Python基础教程,Python入门教程(非常详细) http://www.baidu.com/link?url=elAepKY7rhULzTPuwKvk8Cxx21K5D0Ey7-Wj9TZgN49MyasPOXtLYfWbp46QZQie
这样,我们爬取数据的目的就达到了。当然,我们可以继续扩展,更多地使用pyppeteer。比如我们可以点击下一页,抓取下一页的内容。
# next page
# 为了点击“下一页”,需要将当前页面滑到底部
dimensions = await page.evaluate('window.scrollTo(0, window.innerHeight)')
# 点击“下一页”按钮
await page.click('.n')
# 获取第二页的内容
content = await page.content()
# 解析
output_search_result(content)
操作与上一个类似,注释更清晰,这里不再赘述。最后,您可以调用 await browser.close() 代码关闭浏览器。上面的代码可以定义在一个异步函数中,比如:
async def main():
# ... 抓取代码
然后传递以下代码
asyncio.get_event_loop().run_until_complete(main())
调用主函数。
这里介绍pyppeteer的用法。有很多类似的工具,比如Selenium。我也试过了。实际上,按照 Internet 上的说明对其进行配置需要一些努力。有兴趣的可以自行尝试。希望今天的内容对你有用。关注公众号回复关键词爬虫获取完整源码
欢迎关注公众号“穿越码”,输出别处看不到的干货。