如何使用 Hrequests 进行网络抓取
在本指南中,我将向您介绍如何使用以下工具从网站收集信息 需求.如果你是新手,也不用担心,我会简单明了地一步步教你。
我们首先安装 Hrequests,然后发送 HTTP 请求并提取有用的数据。然后,我们将深入研究如何处理多个页面、处理动态内容,甚至使用并发来加快速度。到最后,你就会知道如何像专业人员一样搜索网站了。
如果你对网络搜刮感到好奇,并希望有一个简单的入门方法,本指南就是为你准备的。让我们开始吧!
什么是 Hrequests?
Hrequests 代表 "人类请求"。它是一个 Python 库,专门用于网络搜刮。Hrequests 结合了 HTTP 客户端、HTML 解析器和无头浏览器。这意味着你可以用它来抓取静态和动态网站。该库简单易用,非常适合网络搜刮新手使用。
Hrequests 可以让你的网络搜刮项目变得更简单。如果您的网站以简单的 HTML 显示内容,您可以使用 HTTP 客户端和解析器。如果需要与使用 JavaScript 加载数据的网站进行交互,则可以使用无头浏览器功能。Hrequests 还有一个模仿人类行为的模拟选项。这可以帮助你在某些网站上避免僵尸检测。
利用Bright Data增强您的搜索设置
Bright Data 的高级代理服务 提供强大的高速连接,与 Hrequests 无缝互补。通过将其旋转式住宅代理集成到您的网络搜索工作流程中,您可以绕过反僵尸措施,提高数据检索效率,而无需进行复杂的配置。
在我的 最佳代理提供商文章.
Hrequests 入门
开始之前,您需要确保计算机上安装了 Python 3。您可以从官方网站下载最新版本的 Python。安装 Python 后,可以使用 pip 安装 Hrequests。打开终端或命令提示符,键入以下命令:
pip install -U hrequests[全部]
该命令将安装 Hrequests 及其支持库。其中一个库是 Playwright,Hrequests 使用它来实现无头浏览器功能。
接下来,需要安装 Playwright 的网络驱动程序。运行此命令:
戏剧安装
安装 Hrequests 和网络驱动程序后,为项目创建一个新文件夹。打开你喜欢的代码编辑器,创建一个新的 Python 文件,例如 scraper.py。现在您就可以开始编写网络搜刮程序了。
了解有关使用 Playwright 进行网络刮擦的更多信息 这里.
发出第一个 HTTP 请求
网络搜索的第一步是向网站发送 HTTP 请求,获取 HTML 内容。Hrequests 使这项任务变得简单。在你的 scraper.py 文件中,首先导入 Hrequests:
import 请求
接下来,使用 get 方法向目标网站发送请求。例如,如果要抓取一个电子商务演示网站,可以使用以下代码:
response = hrequests.get("https://www.scrapingcourse.com/ecommerce/")
这行代码向网站发送 GET 请求。响应对象包含页面的 HTML。要查看 HTML,可以打印响应文本:
html_content = response.text
print(html_content)
运行这段代码后,页面的完整 HTML 内容将打印到控制台。这是您迈向网络搜索的第一步。
从 HTML 中提取数据
有了 HTML 内容后,下一步就是提取有价值的数据。网页包含许多元素,如段落、图片和链接。Hrequests 内置的 HTML 解析器可以帮助您找到这些元素。假设您想从电子商务页面中提取产品详细信息,如产品名称、价格、URL 和图片来源。
首先,在浏览器中检查网站。右键单击产品,选择 "检查",查看 HTML 结构。您可能会注意到,每个产品都在一个
- 标签的类名,如 "产品"。有了这些信息,您就可以使用 CSS 选择器来查找这些元素。
下面是一个提取产品详细信息的示例代码片段:
# 获取所有产品容器
产品 = response.html.find_all(".产品")
# 创建一个空列表来保存产品数据
产品数据 = []
# 循环浏览每个产品容器以提取详细信息
for product in 产品:
data = {
"name": product.find(".woocommerce-loop-产品__标题").text、
"price": product.find(".价格").text.replace("n", ""),
"url": product.find("a").href、
"img": product.find("img").src
}
product_data.append(data)
# 打印提取的产品数据
print(product_data)
在上面的代码中,我们首先找到所有带有 .product 类的元素。然后在这些元素上循环,提取所需的文本和属性。我们使用 replace 方法删除价格数据中不需要的换行符。
运行这段代码后,您将在控制台中看到一个字典列表。每个字典代表一个产品,包括名称、价格、URL 和图片来源。
将数据保存到 CSV 文件
将搜刮到的数据存储到 CSV 文件中是一种常见的做法。Python 内置的 CSV 模块使这项任务变得简单明了。将产品数据保存在字典列表中后,就可以将数据写入 CSV 文件。
您可以这样做:
import csv
# 定义第一个产品字典中的键
keys = product_data[0].keys()
# 以写入模式打开一个新的 CSV 文件
with open("product_data.csv", "w", newline="", encoding="utf-8") as 输出文件:
dict_writer = csv.DictWriter(output_file, fieldnames=keys)
dict_writer.writeheader()
dict_writer.writerows(product_data)
print("CSV 创建成功")
此代码片段将创建一个名为 product_data.csv 的 CSV 文件,并写入文件头和行。打开文件后,您将看到表格格式的数据。这种方法对于保存和日后分析刮擦数据非常有用。
扫描多个页面
许多网站使用分页来显示大量项目。如果需要从所有页面中抓取数据,就必须浏览每个页面。让我们看看如何修改代码以处理多个页面。
使用循环进行分页
假设网站在多个页面上显示产品,并带有 "下一页 "按钮。下面的代码使用 while 循环来检查下一页,并抓取数据,直到没有可用页面为止:
# 定义扫描当前页面的函数
def 刮刀(response):
products = response.html.find_all(".产品")
产品数据 = []
for product in 产品:
data = {
"name": product.find(".woocommerce-loop-产品__标题").text、
"price": product.find(".价格").text.replace("n", ""),
"url": product.find("a").href、
"img": product.find("img").src
}
product_data.append(data)
return 产品数据
# 从申请第一页开始
response = hrequests.get("https://www.scrapingcourse.com/ecommerce/")
# 收集所有产品的清单
所有产品 = []
while True:
# 从当前页面抓取数据
all_products.extend(scraper(response))
# 查找下一页元素
next_page = response.html.find(".下一个")
# 如果找到下一页,继续刮擦
if next_page.href
response = hrequests.get(next_page.href)
else:
break
print(所有产品)
这段代码定义了一个从页面中提取数据的函数 scraper。然后,我们使用 "下一页 "按钮循环浏览页面。当没有下一页时,循环停止。这种方法可以帮助你从网站的所有页面收集数据。
使用并发功能加快扫描速度
当您有许多页面需要抓取时,逐个抓取可能会花费很长时间。Hrequests 支持并发。这意味着您可以同时请求多个页面。许多网站的 URL 都带有页码,例如
https://www.scrapingcourse.com/ecommerce/page/1/
https://www.scrapingcourse.com/ecommerce/page/2/
...
了解更多 使用 Python 进行并发刮擦.
同时扫描多个页面
下面是一个如何同时抓取多个页面的示例:
# 各页面的 URL 列表
urls = [
"https://www.scrapingcourse.com/ecommerce/page/1/",
"https://www.scrapingcourse.com/ecommerce/page/2/",
"https://www.scrapingcourse.com/ecommerce/page/3/",
"https://www.scrapingcourse.com/ecommerce/page/4/",
"https://www.scrapingcourse.com/ecommerce/page/5/",
"https://www.scrapingcourse.com/ecommerce/page/6/",
"https://www.scrapingcourse.com/ecommerce/page/7/",
"https://www.scrapingcourse.com/ecommerce/page/8/",
"https://www.scrapingcourse.com/ecommerce/page/9/",
"https://www.scrapingcourse.com/ecommerce/page/10/",
"https://www.scrapingcourse.com/ecommerce/page/11/",
"https://www.scrapingcourse.com/ecommerce/page/12/"
]
# 同时请求所有 URL
responses = hrequests.get(urls)
# 保存所有产品数据的清单
所有产品 = []
# 循环处理每个响应以提取产品数据
for response in 响应:
all_products.extend(scraper(response))
print(所有产品)
该方法会同时向所有页面发送请求。然后循环查看每个响应并收集产品数据。并发会加快搜索过程。当你需要快速扫描许多页面时,这种方法非常有用。
抓取 JavaScript 渲染的页面
并非所有网站都提供静态 HTML。有些网站使用 JavaScript 加载内容。Hrequests 自带无头浏览器功能。该功能可以呈现需要 JavaScript 的页面。一个常见的例子是无限滚动。在无限滚动中,当您向下滚动页面时会加载新内容。
使用请求获取动态内容
让我们看看如何抓取使用无限滚动的页面。在这个示例中,我们将抓取一个在滚动时加载产品项目的网站。
首先,从 Hrequests 中导入 Session 类和时间模块:
from 请求 import 会议
import time
设置无头浏览器
使用无头浏览器创建会话。您可以选择 Chrome 浏览器等浏览器:
session = Session(browser="铬")
现在,创建一个页面会话 和 加载目标网站:
page = session.render("https://www.scrapingcourse.com/infinite-scrolling")
滚动页面
这样做的目的是向下滚动页面,直到没有新内容加载为止。您可以使用 JavaScript 进行滚动。使用评估方法在浏览器中运行 JavaScript:
# 获取页面的当前高度
last_height = page.evaluate("document.body.scrollHeight)
while True:
# Scroll down the page
page.evaluate("window.scrollTo(0,document.body.scrollHeight)")
# 等待加载新内容
time.sleep(10)
# 获取滚动后的新高度
new_height = page.evaluate("document.body.scrollHeight)
# 检查页面高度是否增加
if new_height == last_height:
break
# 更新高度
last_height = new_height
该循环将继续滚动,直到页面不再加载新内容。
滚动后提取数据
页面停止加载新内容后,就可以提取产品数据了。定义一个函数,从动态页面中抓取数据:
def 刮刀(page):
products = page.html.find_all(".产品-项目")
产品数据 = []
for product in 产品:
data = {
"name": product.find(".产品名称").text、
"price": product.find(".产品价格").text
}
product_data.append(data)
print(product_data)
# 调用刮板功能
scraper(page)
# 关闭浏览器会话
page.close()
该代码将从使用无限滚动的页面中打印产品名称和价格。无头浏览器可帮助加载和呈现所有 JavaScript 内容。
应对挑战和限制
虽然 Hrequests 是一个功能强大的工具,但它也有一些局限性。其中一个限制是它的用户群较小。如果遇到问题,就很难找到帮助。另一个挑战是 Hrequests 不支持代理验证。许多高级代理服务都需要这项功能。
此外,Hrequests 可能无法绕过先进的反僵尸系统。受 Cloudflare、Akamai 或 DataDome 等服务保护的网站可能会阻止您的搜刮程序。例如,如果您尝试从一个具有强大反僵尸保护的网站上进行搜刮,您可能会得到一个被阻止的响应,而不是完整的 HTML 内容。
克服反机器人措施
如果遇到反机器人系统,您可能需要使用其他解决方案。Bright Data API 就是这样一种解决方案。Bright Data 可以处理代理旋转、无头浏览器和验证码问题。它可以帮助您绕过大多数反僵尸措施。
下面举例说明如何在 Python 代码中使用 Bright Data:
import requests
url = "https://www.g2.com/products/asana/reviews"
密码 = ""
params = {
"url": url、
"apikey": apikey、
"js_render": "true",
"premium_proxy": "true",
}
response = requests.get("https://api.brightdata.com/v1/", params=params)
print(response.text)
该代码向 Bright Data API 发送请求。然后,Bright Data 会处理代理旋转和 JavaScript 渲染。因此,您可以访问通常会阻止您的刮擦程序的网站。
当你面临严密的反僵尸保护时,Bright Data 是一个不错的选择。不过,Hrequests 对许多网络搜索任务来说仍然是一个很好的工具。你可以选择最适合自己的工具。
网络抓取最佳实践
在使用 Hrequests 或任何其他网络搜刮工具时,必须遵循一些最佳实践。以下是一些提示:
- 尊重网站的 Robots.txt: 许多网站都有 robots.txt 文件。该文件会告诉你网站的哪些部分允许你进行搜刮。在开始搜刮之前,请务必检查该文件。
- 不要让网站超载: 确保在请求之间增加延迟。这样可以避免在短时间内发送过多请求。服务器超载会导致你的 IP 被屏蔽。
- 优雅地处理错误 网站可以随时更改其结构。确保在代码中添加错误处理功能。这样,您的刮擦器就能处理丢失的元素或连接问题,而不会崩溃。
- 明智使用并发性 虽然并发可以加快刮擦速度,但不要一次发送过多请求。尊重目标网站的服务器负载,避免造成问题。
- 安全存储数据 在将数据保存到文件或数据库时,确保安全存储。始终对数据进行验证和消毒,以避免日后出现问题。
结论
Hrequests 是一个功能强大、易于使用的 Python 网络搜索库。它既能处理静态内容,也能处理动态内容,是许多项目的最佳选择。无论您是要抓取一个简单的电子商务网站,还是要抓取一个无限滚动的复杂网站,Hrequests 都能帮助您完成工作。使用本指南中的示例开始你自己的项目。通过实践和精心策划,你将能构建出满足自己需求的高效网络刮擦工具。