器→工具, 开源项目, 术→技巧, 研发

Python网页抓取包requests-html

钱魏Way · · 110 次浏览

requests-html简介

requests-html 是一个用于网页抓取和解析的 Python 库,由 Kenneth Reitz 创建,旨在为开发者提供一个强大且易用的工具来处理 HTML 内容。与传统的网页抓取库不同,requests-html 集成了对现代网页技术(如 JavaScript 渲染)的支持,这使得它在处理动态内容时特别有用。

requests-html 和 requests 都是用于网络请求的 Python 库,但它们的功能和用途有所不同。

requests 是一个流行且简单易用的 HTTP 库,用于发送 HTTP 请求和处理响应。它的主要功能包括:

  • 发送请求:支持各种 HTTP 方法,如 GET、POST、PUT、DELETE 等。
  • 处理响应:能够方便地获取响应的状态码、头信息、内容等。
  • 会话管理:支持会话对象,以便在多个请求之间保持某些参数(如 cookie)。
  • SSL 证书验证:默认情况下会验证 SSL 证书,也可以配置为忽略。
  • 文件上传和下载:支持文件上传和流式下载。

requests-html 是基于 requests 的一个库,除了具有 requests 的功能外,还增加了一些用于解析和处理 HTML 的功能。它主要用于 Web 抓取和网页解析,具有以下特点:

  • HTML 解析:内置了pyquery,类似于 jQuery 的 API,可以方便地进行 HTML DOM 操作。
  • JavaScript 渲染:使用Pyppeteer(一个基于 Chromium 的无头浏览器)支持渲染 JavaScript,适合处理需要动态加载内容的网页。
  • CSS 选择器和 XPath 支持:提供便捷的选择器方法来提取页面元素。
  • 异步支持:可以使用异步方法进行请求和渲染。

总结

  • 功能侧重:requests主要用于发送 HTTP 请求和处理响应,而 requests-html 更侧重于网页抓取和解析。
  • JavaScript 渲染:requests-html支持渲染 JavaScript,这在需要处理动态内容的网页时非常有用。
  • 依赖和复杂性:requests-html由于增加了浏览器渲染功能,依赖项更多,使用时也更复杂一些。

选择哪个库主要取决于你的具体需求:如果只是需要简单的 HTTP 请求,requests 就足够了;如果需要进行网页抓取和处理动态内容,requests-html 会更合适。

应用场景

  • 动态网页抓取:处理需要 JavaScript 渲染的网页内容。
  • 数据提取和分析:从网页中提取特定数据,如价格、标题、描述等。
  • 自动化测试:模拟用户行为,测试网页功能。
  • 网页监控:定期抓取和检查网页内容变化。

requests-html的使用

安装

可以通过 pip 安装 requests-html:pip install requests-html

基本用法

发起简单请求

from requests_html import HTMLSession

# 创建一个会话对象
session = HTMLSession()

# 发起 GET 请求
response = session.get('https://example.com')

# 输出页面标题
print(response.html.find('title', first=True).text)

处理 JavaScript 渲染

from requests_html import HTMLSession

session = HTMLSession()

# 发起 GET 请求并渲染 JavaScript
response = session.get('https://example.com')
response.html.render()

# 输出渲染后的页面内容
print(response.html.html)

使用 CSS 选择器提取内容

from requests_html import HTMLSession

session = HTMLSession()

response = session.get('https://example.com')

# 查找所有链接
links = response.html.find('a')

for link in links:
    print(link.text, link.attrs['href'])

高级功能

异步请求

requests-html 支持异步请求,这对于需要同时抓取多个网页的场景非常有用:

import asyncio
from requests_html import AsyncHTMLSession

asession = AsyncHTMLSession()

async def fetch(url):
    response = await asession.get(url)
    return response

# 批量请求
results = asession.run(fetch, 'https://example.com', fetch, 'https://example.org')
for result in results:
    print(result.html.find('title', first=True).text)

会话管理

可以在多个请求之间共享会话数据,例如 cookies:

from requests_html import HTMLSession

session = HTMLSession()

# 第一个请求
response = session.get('https://example.com/login')

# 提交登录表单
response = session.post('https://example.com/login', data={'username': 'user', 'password': 'pass'})

# 访问需要登录的页面
response = session.get('https://example.com/dashboard')
print(response.html.html)

参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注