7个最佳Python Web爬虫库

努力寻找最好的 Python 网络抓取库来使用?你并不孤单。如果由于速度慢或容易被反机器人检测到而失败,那么选择一个抓取库可能会非常麻烦。

一个好的用于网页抓取的 Python 库应该是快速的、可扩展的并且能够抓取任何类型的网页。在本文中,我们将讨论七个最佳选项、它们的优缺点,以及一些帮助您了解它们如何工作的快速示例。

什么是最好的 Python Web 抓取库

我们做了一些后台测试来检查和验证哪个 Python 网络抓取库能够毫无问题地抓取网页。

最好的就是最好的:

  1. ZenRows.
  2. Selenium.
  3. Requests.
  4. Beautiful Soup.
  5. Playwright.
  6. Scrapy.
  7. urllib3.

让我们通过一些Python 网络抓取示例来详细讨论这些库。我们将在Vue Storefront中提取每个产品的详细信息。

1.ZenRows

medium_zenrowsdashboard1_55a26b5820

ZenRows API 是一个 Python 网络抓取库,能够解决最大的抓取问题:被阻止。它的功能包括轮换和高级代理、无头浏览器、地理定位、JavaScript 渲染等等。使用 ZenRows 可以让您省去挫败感、时间和资源。

👍优点:

  • ZenRows 易于使用。
  • 它可以有效地绕过验证码和反机器人。
  • 它提供智能旋转代理。
  • 它可以抓取 JavaScript 呈现的页面。
  • 它还适用于其他库。

👎缺点:

  • 这是一项付费服务​​,但提供免费试用。

如何使用 ZenRows 抓取网页

第 1 步:生成 Python 代码

创建一个免费的 ZenRows 帐户并导航到仪表板以开始使用。在仪表板中,选择Python并输入目标网站的 URL。

medium_image2_ee1a09b66e

由于我们的目标网页是动态生成的,因此激活JavaScript 呈现选项并从显示的选项中选择JavaScript 指令。对于此示例,您需要包含“fill”键,这是一个包含搜索框 ID(“#search”)和单词“laundry”的列表。

small_image10_169cccb589

wait_for键使脚本等待特定项目的出现,在本例中为类为 的项目sf-product-card__title。该wait参数是可选的,指示在检索信息之前等待多少毫秒。

第 2 步:解析响应

ZenRows 对解析生成的 HTML 的支持有限,因此我们将使用BeautifulSoup。它有不同的方法,如findfind_all,可以帮助从 HTML 树中获取具有特定 ID 或类的元素。

继续导入库,然后通过传递从 URL 中提取的数据来创建一个新的 BeautifulSoup 对象。然后分配第二个参数,解析器,它可以是html.parser,xmllxml。创建一个名为“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

medium_image6_b8936616c4

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

medium_image4_30bd8c3cb0

Requests是一个用户友好的 Python 网络抓取库,构建在 urllib3 之上。它可以在没有实例的情况下直接获取 URL PoolManager。此外,一旦发出请求,就可以使用响应对象上的属性GET来访问网页的内容。content

它简化了发送 HTTP 请求和处理响应的过程,使开发人员更容易与 Web 服务和 API 进行交互。

👍优点:

  • 它不需要PoolManager
  • 它很快。
  • 这很容易理解。

👎缺点:

  • 它无法使用 JavaScript 抓取交互式或动态网站。
  • 这对敏感信息不利,因为它可能会保留在浏览器的内存中。

如何使用 Requests 抓取网页

让我们使用带有厨房产品列表的Vue Storefront页面。页面上的五个项目中的每一个在span标签上都有一个标题,类别为sf-product-card__title.

medium_image5_840701b837

第一步:使用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_allBeautifulSoup 对象上的方法提取具有类的 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

medium_image1_b558f4cc50

Beautiful Soup是一个强大的 Python 网络抓取库,特别适用于解析 XML 和 HTML 文档。它的便利性是其最受欢迎的福利之一。Beautiful Soup 建立在著名的 Python 解析包之上,允许您尝试不同的技术。

使用 Beautiful Soup,您可以扫描已解析的文档并识别特定类型或格式下的所有数据。它具有强大的编码检测功能。

👍优点:

  • 易于使用和导航。
  • 可扩展的功能。
  • 积极的社区支持。
  • 详细的文档。

👎缺点:

  • 支持有限。
  • 您需要安装多个依赖项。

更多:看看我们的Beautiful Soup 网络抓取教程,学习使用这个 Python 库。

5.Playwright

medium_image9_d6f1cd661d

Playwright是一个开源网络抓取库,可以更轻松地跨不同浏览器从网站中提取数据,因为它提供了出色的跨浏览器自动化解决方案。

尽管 Playwright 易于使用,但其概念和功能可能仍需要一些时间才能正确理解。并且因为它需要运行不同的浏览器实例,所以它比其他库消耗更多的内存。

👍优点:

  • 跨浏览器支持。
  • 高级 API。
  • 强大的选择器引擎。
  • 无头模式。

👎缺点:

  • 这是资源密集型的。
  • 持续维护或更新。
  • 陡峭的学习曲线。

更多:查看Playwright 网络抓取教程以开始使用。

6.Scrapy

medium_image7_450f2b2744

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

medium_image8_4bd1b623ea

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库是最常用的网络抓取库之一,因为它有助于提出基本请求以进行进一步分析

类似文章