1. 动态页面介绍
如果你曾经试图爬取那些通过JavaScript实时更新内容的网站, 那么你可能知道这真的是一件让人头疼的事。但别担心! 正如人们常说,任何复杂的代码都可以调整得像魔法一样。让我们来看看 requests_html是如何帮助我们处理这些内容的。
众所周知,并不是所有网页都一样有用。 有些页面会直接加载内容,而另一些页面可能会通过JavaScript动态生成或更新内容。 这给想要提取数据的人带来了一些麻烦,因为通过开发者工具看到的HTML可能和通过常规请求获取到的HTML不同。
爬取动态内容时遇到的问题
大多数处理网页的库,比如requests,只处理服务器端的响应,无法执行JavaScript。 这意味着,如果数据是通过JavaScript加载或修改的,你可能在常规请求中根本看不到这些数据。
2. 使用requests_html库
在这里,requests_html登上了舞台——这是一个结合了requests的简洁和浏览器执行JavaScript的强大功能的库。 它提供了一个基础的渲染引擎,让你可以像使用真正的浏览器一样与动态网页互动。
安装和配置库
开始工作之前,让我们先安装requests_html。打开你喜欢的终端,然后执行以下命令:
pip install requests-html
很棒,库已经安装好了!现在我们可以开始使用它。
使用requests_html提取JavaScript内容的基础知识
requests_html让我们的生活更简单。让我们看看它在实践中的表现。假设我们有一个页面,它通过JavaScript生成一些数据。
from requests_html import HTMLSession
# 创建HTML会话
session = HTMLSession()
# 向网页发送请求
response = session.get('https://example-dynamic-page.com')
# 渲染JavaScript
response.html.render()
# 提取数据
data = response.html.find('#dynamic-content', first=True)
print(data.text)
这就是魔法!与requests不同,requests_html提供了一个 .render()方法,允许“运行”页面并执行JavaScript。 页面“活了”之后,你就可以使用我们之前学过的选择器提取所有需要的数据。
3. 数据提取示例
现在让我们深入一点,看看几个示例,这样你就可以了解 requests_html是如何在不同场景中帮助我们的。
动态页面数据提取实战
想象一下一个页面,它只有在滚动后才加载最新动态。 使用requests_html,我们可以模拟用户的行为。
url = 'https://example-news-site.com'
# 加载页面
response = session.get(url)
# 如果需要,增加渲染的超时时间
response.html.render(timeout=20)
# 查找包含新闻的元素
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
你看,就这么轻松自如地,我们访问了以前看来难以捉摸的内容!
使用requests_html处理加载的JavaScript内容
使用requests_html和我们在之前课程中学过的CSS选择器, 你可以像一个资深爬虫工程师一样处理网页内容!
# 选择第一个新闻标题元素
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# 从元素中提取链接
link = headline.find('a', first=True).attrs['href']
print(link)
4. 实用建议和技巧
虽然requests_html是一个强大的工具,但在使用它时需要记住几点:
- 超时和延迟:别忘了为更复杂的页面设置渲染超时。 这样可以避免因加载缓慢导致的错误。
- 渲染能力:
requests_html可能会消耗大量资源,因为它需要渲染JavaScript。 对于大量数据或复杂页面,这可能会使过程变慢。 - CAPTCHA和反爬保护:
requests_html无法绕过反爬虫保护和CAPTCHA, 所以对于更复杂的情况,最好使用Selenium。
GO TO FULL VERSION