7个最佳Python Web爬虫库
努力寻找最好的 Python 网络抓取库来使用?你并不孤单。如果由于速度慢或容易被反机器人检测到而失败,那么选择一个抓取库可能会非常麻烦。
一个好的用于网页抓取的 Python 库应该是快速的、可扩展的并且能够抓取任何类型的网页。在本文中,我们将讨论七个最佳选项、它们的优缺点,以及一些帮助您了解它们如何工作的快速示例。
什么是最好的 Python Web 抓取库
我们做了一些后台测试来检查和验证哪个 Python 网络抓取库能够毫无问题地抓取网页。
最好的就是最好的:
让我们通过一些Python 网络抓取示例来详细讨论这些库。我们将在Vue Storefront中提取每个产品的详细信息。
1.ZenRows
ZenRows API 是一个 Python 网络抓取库,能够解决最大的抓取问题:被阻止。它的功能包括轮换和高级代理、无头浏览器、地理定位、JavaScript 渲染等等。使用 ZenRows 可以让您省去挫败感、时间和资源。
👍优点:
- ZenRows 易于使用。
- 它可以有效地绕过验证码和反机器人。
- 它提供智能旋转代理。
- 它可以抓取 JavaScript 呈现的页面。
- 它还适用于其他库。
👎缺点:
- 这是一项付费服务,但提供免费试用。
如何使用 ZenRows 抓取网页
第 1 步:生成 Python 代码
创建一个免费的 ZenRows 帐户并导航到仪表板以开始使用。在仪表板中,选择Python并输入目标网站的 URL。
由于我们的目标网页是动态生成的,因此激活JavaScript 呈现选项并从显示的选项中选择JavaScript 指令。对于此示例,您需要包含“fill”键,这是一个包含搜索框 ID(“#search”)和单词“laundry”的列表。
该wait_for
键使脚本等待特定项目的出现,在本例中为类为 的项目sf-product-card__title
。该wait
参数是可选的,指示在检索信息之前等待多少毫秒。
第 2 步:解析响应
ZenRows 对解析生成的 HTML 的支持有限,因此我们将使用BeautifulSoup。它有不同的方法,如find
和find_all
,可以帮助从 HTML 树中获取具有特定 ID 或类的元素。
继续导入库,然后通过传递从 URL 中提取的数据来创建一个新的 BeautifulSoup 对象。然后分配第二个参数,解析器,它可以是html.parser
,xml
或lxml
。创建一个名为“zenrowsTest.py”的新文件并粘贴此代码:
from zenrows import ZenRowsClient from bs4 import BeautifulSoup import json client = ZenRowsClient("YOUR_API_KEY") url = "https://demo.vuestorefront.io/" js_instructions = [ {"wait":500}, {"fill":["#search","laundry"]}, {"wait_for":".sf-product-card__title"} ] params = { "js_render":"true", "js_instructions": json.dumps(js_instructions), } response = client.get(url, params=params) soup = BeautifulSoup(response.text, "html.parser") for item in soup.find_all("span", {"class": "sf-product-card__title"}): print(item.text)
您已经使用 ZenRows 成功地抓取了一个网页。输出如下所示:
[Sample] Canvas Laundry Cart [Sample] Laundry Detergent
2. Selenium
Selenium是一种广泛使用的 Python 抓取库,用于抓取动态 Web 内容。它通过点击按钮、填写表格等方式模仿人类互动。
Selenium 与许多浏览器兼容,例如 Chrome 和 Firefix,允许您选择最适合您的 Web 抓取项目的浏览器。这种灵活性有助于确保在不同的浏览器环境中获得一致的结果。
👍优点:
- 它可以抓取动态网页。
- 多浏览器支持。
👎缺点:
- Selenium可能很慢。
- 它无法获取状态代码。
- 这是耗费时间和资源的。
如何使用 Selenium 抓取网页
第 1 步:找到输入标签
要使用 Selenium 抓取网页,您可以使用 WebDriver并使用该方法定位输入标签元素(搜索框)find_element
。找到正确的输入元素后,编写所需的查询,然后按 Enter。
第 2 步:检索 span 标签
找到元素后,您可以找到span
返回项目的标签。由于服务器可能需要很长时间才能返回结果,您可以使用WebDriverWait
等待服务器显示它们。
一旦项目可用,通过将它们的类名作为参数提供给find_elements
方法来获取它们。这是我们刚才提到的一切:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait url = "https://demo.vuestorefront.io/" with webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) as driver: driver.get(url) input = driver.find_element(By.CSS_SELECTOR, "input[type='search']") input.send_keys("laundry" + Keys.ENTER) el = WebDriverWait(driver, timeout=3).until( lambda d: d.find_element(By.CLASS_NAME, "sf-product-card__title")) items = driver.find_elements(By.CLASS_NAME, "sf-product-card__title") for item in items: print(item.text)
运行代码后,您应该会在控制台上看到打印的两个项目的名称:
[Sample] Canvas Laundry Cart [Sample] Laundry Detergent
3.Requests
Requests是一个用户友好的 Python 网络抓取库,构建在 urllib3 之上。它可以在没有实例的情况下直接获取 URL PoolManager
。此外,一旦发出请求,就可以使用响应对象上的属性GET
来访问网页的内容。content
它简化了发送 HTTP 请求和处理响应的过程,使开发人员更容易与 Web 服务和 API 进行交互。
👍优点:
- 它不需要
PoolManager
。 - 它很快。
- 这很容易理解。
👎缺点:
- 它无法使用 JavaScript 抓取交互式或动态网站。
- 这对敏感信息不利,因为它可能会保留在浏览器的内存中。
如何使用 Requests 抓取网页
让我们使用带有厨房产品列表的Vue Storefront页面。页面上的五个项目中的每一个在span
标签上都有一个标题,类别为sf-product-card__title
.
第一步:使用GET方法获取主要内容
使用此代码:
import requests r = requests.get('https://demo.vuestorefront.io/c/kitchen')
该GET
方法返回一个响应对象。您可以使用该属性获取状态代码status_code
(在本例中,它返回 code 200
),并从中获取带有 content 属性的 HTML 数据。响应对象保存在变量中r
。
第二步:用BeautifulSoup提取具体信息
sf-product-card__title
通过使用find_all
BeautifulSoup 对象上的方法提取具有类的 span 标签:
from bs4 import BeautifulSoup soup = BeautifulSoup(r.content, 'html.parser') for item in soup.find_all('span', {'class': 'sf-product-card__title'}): print(item.text)
这将返回在文档中找到的具有类的所有标签的列表span
,并且使用一个简单的for
循环,您可以在屏幕上打印所需的信息。让我们创建一个名为“requestsTest.py”的新文件并编写以下代码:
import requests from bs4 import BeautifulSoup r = requests.get('https://demo.vuestorefront.io/c/kitchen') soup = BeautifulSoup(r.content, 'html.parser') for item in soup.find_all('span', {'class': 'sf-product-card__title'}): print(item.text)
恭喜!你做到了; 您已成功使用 Request Python 库进行网络抓取。您的输出应如下所示:
[Sample] Tiered Wire Basket [Sample] Oak Cheese Grater [Sample] 1 L Le Parfait Jar [Sample] Chemex Coffeemaker 3 Cup [Sample] Able Brewing System
4. BeautifulSoup
Beautiful Soup是一个强大的 Python 网络抓取库,特别适用于解析 XML 和 HTML 文档。它的便利性是其最受欢迎的福利之一。Beautiful Soup 建立在著名的 Python 解析包之上,允许您尝试不同的技术。
使用 Beautiful Soup,您可以扫描已解析的文档并识别特定类型或格式下的所有数据。它具有强大的编码检测功能。
👍优点:
- 易于使用和导航。
- 可扩展的功能。
- 积极的社区支持。
- 详细的文档。
👎缺点:
- 支持有限。
- 您需要安装多个依赖项。
更多:看看我们的Beautiful Soup 网络抓取教程,学习使用这个 Python 库。
5.Playwright
Playwright是一个开源网络抓取库,可以更轻松地跨不同浏览器从网站中提取数据,因为它提供了出色的跨浏览器自动化解决方案。
尽管 Playwright 易于使用,但其概念和功能可能仍需要一些时间才能正确理解。并且因为它需要运行不同的浏览器实例,所以它比其他库消耗更多的内存。
👍优点:
- 跨浏览器支持。
- 高级 API。
- 强大的选择器引擎。
- 无头模式。
👎缺点:
- 这是资源密集型的。
- 持续维护或更新。
- 陡峭的学习曲线。
更多:查看Playwright 网络抓取教程以开始使用。
6.Scrapy
Scrapy是一个高级框架,用于从高度复杂的网站中抓取数据。有了它,就可以使用预定义函数或外部库绕过验证码。
您可以编写一个简单的 Scrapy 爬虫,通过 Python 类使用对象定义来抓取 Web 数据。但是,与其他 Python 抓取库相比,它并不是特别用户友好。
虽然这个库的学习曲线很陡峭,但你可以用它做很多事情,而且它在执行爬行任务时效率很高。
👍优点:
- 用于抓取目的的通用框架。
- 强大的编码支持。
- 它不需要 BeautifulSoup。
👎缺点:
- 陡峭的学习曲线。
- Scrapy 不能抓取动态网页。
- 不同的网站需要不同的安装步骤。
如何使用 Scrapy 抓取网页
第一步:创建Spider
类
创建一个名为 的新类kitchenSpider
并为其提供参数scrapy.Spider
。在类中,将名称定义为mySpider
,并将start_urls
其定义为要抓取的 URL 列表。
import scrapy class kitchenSpider(scrapy.Spider): name='mySpider' start_urls = ['https://demo.vuestorefront.io/c/kitchen',]
第二步:定义解析方法
parse 方法接受一个response
参数,您可以使用CSS
响应对象上的方法检索每个项目。该CSS
方法可以将项目类的名称作为其参数:
response.css('.sf-product-card__title')
要检索具有该类的所有项目,请创建一个for
循环并使用 XPath 方法打印内容:
for item in response.css('.sf-product-card__title'): print(item.xpath('string(.)').get())
使用以下代码创建一个名为“scrapyTest.py”的新文件:
import scrapy class kitchenSpider(scrapy.Spider): name='mySpider' start_urls = ['https://demo.vuestorefront.io/c/kitchen',] def parse(self, response): for item in response.css('.sf-product-card__title'): print(item.xpath('string(.)').get())
通过在终端中执行以下脚本来运行蜘蛛,您应该会在屏幕上看到打印的项目列表:
scrapy runspider scrapyTest.py [Sample] Tiered Wire Basket [Sample] Oak Cheese Grater [Sample] 1 L Le Parfait Jar [Sample] Chemex Coffeemaker 3 Cup [Sample] Able Brewing System
7. urllib3
urllib3是一个 HTTP 客户端,以其可靠性、性能优化和广泛的功能而闻名。它为发出 HTTP 请求提供了坚实的基础,并且经常被其他 Python 网络抓取库或框架使用。
PoolManager
它与一个实例(类)、一个管理连接池和线程安全的响应对象一起工作。
👍优点:
- 可扩展性。
- 良好的社区支持。
- 它处理与
PoolManager
.
👎缺点:
- 与 Requests 等其他库相比,语法复杂。
- urllib3 无法提取动态数据。
如何使用 urllib3 抓取网页
第 1 步:创建PoolManager
实例
导入 urllib3 库,然后创建一个PoolManager
实例并将其保存到一个名为的变量中http
:
import urllib3 http = urllib3.PoolManager()
PoolManager
创建实例后,您可以GET
使用实例request()
上的方法发出 HTTP 请求。
第 2 步:提出GET
请求
request
在实例上使用该方法PoolManager
。您可以给请求方法两个参数来发出一个简单的GET
请求。对于这种情况,第一个是 string GET
,第二个是您要抓取的 URL 给出的字符串:
r = http.request('GET', 'https://demo.vuestorefront.io/c/kitchen')
第 3 步:从响应对象中提取数据
请求响应由 HTTPResponse 对象给出,您可以从中获取状态码等信息。让我们使用data
响应对象和 BeautifulSoup 上的方法获取数据:
soup = BeautifulSoup(r.data, 'html.parser')
要提取数据,请使用for
带有find_all
方法和项目类名称的循环:
for item in soup.find_all('span', {'class': 'sf-product-card__title'}): print(item.text)
使用以下代码创建一个名为“urllib3Test.py”的新文件:
import urllib3 from bs4 import BeautifulSoup http = urllib3.PoolManager() r = http.request('GET', 'https://demo.vuestorefront.io/c/kitchen') soup = BeautifulSoup(r.data, 'html.parser') for item in soup.find_all('span', {'class': 'sf-product-card__title'}): print(item.text)
您已使用 urllib3 Python 网络抓取库成功地从 Vue 店面的厨房类别中抓取数据。
常见问题
为什么用于网络抓取的 Python 库很重要?
Python 是开发人员用来构建网络抓取工具的最流行的语言之一。那是因为它的类和对象比任何其他语言都更容易使用。
但是,在 Python 上从头开始构建自定义爬虫将很困难,特别是如果您想抓取许多自定义网站并绕过反机器人措施。Python 网络爬虫库简化并减少了冗长的过程。
最流行的网络抓取 Python 库是什么?
Requests库是最常用的网络抓取库之一,因为它有助于提出基本请求以进行进一步分析。