如何使用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 上的说明对其进行配置需要一些努力。有兴趣的可以自行尝试。希望今天的内容对你有用。关注公众号回复关键词爬虫获取完整源码

  欢迎关注公众号“穿越码”,输出别处看不到的干货。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线