如何使用Python抓取网页数据,最好的网页抓取Python库

探索一系列用于网页抓取的强大 Python 库,包括用于 HTTP 请求、解析 HTML/XML 和自动浏览的库。

网络抓取已成为当今数据驱动世界中不可或缺的工具。Python 是最流行的抓取语言之一,拥有一个由强大的库和框架组成的庞大生态系统。在本文中,我们将探索用于网络抓取的最佳Python 库,每个库都提供独特的特性和功能来简化从网站提取数据的过程。

本文还将介绍最佳库和最佳实践,以确保高效和负责任的网络抓取。从尊重网站政策和处理率限制到解决常见挑战,我们将提供宝贵的见解,帮助您有效地驾驭网络抓取的世界。

Scrape-It.Cloud

让我们从 Scrape-It.Cloud 库开始,它提供了对用于抓取数据的API 的访问。该解决方案有几个优点。例如,我们通过中介来完成此操作,而不是直接从目标网站抓取数据。这保证了我们在抓取大量数据时不会被阻止,因此我们不需要代理。我们不必解决验证码问题,因为 API 会处理这个问题。此外,我们可以抓取静态页面和动态页面。

特征

借助 Scrape-It.Cloud 库,您可以通过简单的 API 调用轻松从任何站点提取有价值的数据。它解决了代理服务器、无头浏览器和验证码解决服务的问题。 

通过指定正确的 URL,Scrape-It.Cloud 可以快速返回包含必要数据的 JSON。这使您可以专注于提取正确的数据,而不必担心数据被阻止。

此外,此 API 允许您从使用 React、AngularJS、Ajax、Vue.js 和其他流行库创建的动态页面中提取数据。

此外,如果您需要从 Google SERP 收集数据,您还可以将此 API 密钥用于serp api python库。

安装

要安装该库,请运行以下命令:

pip install scrapeit-cloud

要使用该库,您还需要一个 API 密钥。您可以通过在网站上注册来获取它。此外,您还将获得一些免费积分来免费提出请求并探索图书馆的功能。网址:yii666.com

使用示例

对特定库的所有功能、特性和使用方法的详细描述值得单独撰写一篇文章。现在,我们将仅向您展示如何获取任何网页的 HTML 代码,无论您是否可以访问该网页、是否需要验证码解决方案以及页面内容是静态还是动态。

为此,只需指定您的 API 密钥和页面 URL。

from scrapeit_cloud import ScrapeitCloudClient
import json
client = ScrapeitCloudClient(api_key="YOUR-API-KEY")
response = client.scrape(
    params={
  "url": "https://example.com/"
}
)

由于结果采用 JSON 格式,并且页面的内容存储在 属性 中["scrapingResult"]["content"],因此我们将使用它来提取所需的数据。

data = json.loads(response.text)
print(data["scrapingResult"]["content"])

结果,检索到的页面的 HTML 代码将显示在屏幕上。

Requests 和 BeautifulSoup 组合

最简单和最流行的库之一是BeautifulSoup。但是,请记住,它是一个解析库,不具备自行发出请求的能力。因此,它通常与简单的请求库(如Requests、 http.client 或 cUrl )一起使用。 

特征

这个库是为初学者设计的,非常容易使用。此外,它还拥有详细记录的说明和活跃的社区。

BeautifulSoup库(或 BS4)是专门为解析而设计的,这赋予了它广泛的功能。您可以使用 XPath 和 CSS 选择器来抓取网页。

由于其简单性和活跃的社区,在线提供了大量其使用示例。此外,如果您在使用过程中遇到困难,您可以获得帮助来解决您的问题。

安装

如前所述,我们需要两个库来使用它。为了处理请求,我们将使用 Requests 库。好消息是它是预安装的,因此我们不需要单独安装它。但是,我们确实需要安装 BeautifulSoup 库才能使用它。为此,只需使用以下命令:

pip install beautifulsoup4

安装完成后,您可以立即开始使用它。

使用示例

假设我们想要检索<h1>包含标头的标签的内容。为此,我们首先需要导入必要的库并发出请求以获取页面的内容:

import requests
from bs4 import BeautifulSoup

data = requests.get('https://example.com')

为了处理页面,我们将使用 BS4 解析器:

soup = BeautifulSoup(data.text, "html.parser")

现在,我们所要做的就是指定我们想要从页面中提取的确切数据:

text = soup.find_all('h1')

最后,我们将获取到的数据显示在屏幕上:

print(text)

正如我们所看到的,使用该库非常简单。然而,它确实有其局限性。例如,它无法抓取动态数据,因为它是一个与基本请求库而不是无头浏览器一起使用的解析库。

LXML

LXML是另一个流行的数据解析库,它不能单独用于抓取。由于它还需要一个库来发出请求,因此我们将使用我们已经知道的熟悉的 Requests 库。 

特征

尽管它与以前的库相似,但它确实提供了一些附加功能。例如,它比 BS4 更擅长处理 XML 文档结构。虽然它还支持 HTML 文档,但如果您有更复杂的 XML 结构,该库将是更合适的选择。

安装

正如前面提到的,尽管需要请求库,但我们只需要安装 LXML 库,因为其他所需的组件已经预先安装。

要安装 LXML,请在命令提示符中输入以下命令:

pip install lxml

现在让我们继续看一下使用该库的示例。

使用示例

首先,就像上次一样,我们需要使用一个库来获取网页的 HTML 代码。这部分代码与前面的示例相同:

import requests
from lxml import html
data = requests.get('https://example.com')

现在我们需要将结果传递给解析器,以便它可以处理文档的结构:

tree = html.fromstring(data.content)

最后,剩下的就是为所需元素指定 CSS 选择器或 XPath,并将处理后的数据打印在屏幕上。让我们以 XPath 为例:

data = tree.xpath('//h1')
print(data)

结果,我们将得到与上一个示例相同的标题:

['Example Domain']

然而,尽管在简单的示例中可能不太明显,但 LXML 库对于初学者来说比前一个库更具挑战性。它还拥有较少记录的资源和不太活跃的社区。

因此,在处理难以使用其他方法处理的复杂 XML 结构时,建议使用 LXML。

Scrapy

与前面的示例不同,Scrapy不仅仅是一个库,而且是一个成熟的网络抓取框架。它不需要额外的库,并且是一个独立的解决方案。然而,对于初学者来说,这似乎相当具有挑战性。如果这是您的第一个网络抓取工具,那么值得考虑另一个库。

特征

尽管有其缺点,但该框架在某些情况下是非常宝贵的解决方案。例如,当您希望项目易于扩展时。或者,如果您需要在同一项目中使用多个具有相同设置的抓取工具,您只需使用一个命令即可一致运行,并将所有收集到的信息有效地组织成正确的格式。

使用 Scrapy 创建的单个抓取工具称为爬虫,可以是项目中唯一的一个爬虫,也可以是多个爬虫中的一个。该项目有自己的配置文件,适用于项目内的所有抓取工具。此外,每个蜘蛛都有自己的设置,这些设置将独立于整个项目的设置运行。  

安装

您可以像任何其他 Python 库一样通过在命令行中输入安装命令来安装此框架。

pip install scrapy

现在让我们继续讨论使用该框架的示例。

使用示例

与库示例不同,创建项目就像蜘蛛文件一样,是通过特殊命令完成的。必须在命令行中输入它。

首先,让我们创建一个新项目,在其中构建我们的抓取工具。使用以下命令:

scrapy startproject test_project

您可以输入test_project任何其他项目名称。现在我们可以导航到我们的项目文件夹或在此处创建一个新的蜘蛛。

在我们继续创建蜘蛛之前,让我们看一下项目树的结构。 

这里提到的文件是在创建新项目时自动生成的。这些文件中指定的任何设置都将应用于项目中的所有蜘蛛。您可以在“items.py”文件中定义公共类,在“pipelines.py”文件中指定项目启动时要执行的操作,并在“settings.py”文件中配置常规项目设置。

现在让我们回到命令行并导航到我们的项目文件夹:

cd test_project

之后,我们将在所需项目的文件夹中创建一个新的蜘蛛:

scrapy genspider example example.com

接下来,您可以打开蜘蛛文件并手动编辑它。该genspider命令创建一个框架,使您可以更轻松地构建抓取工具。要检索页面的标题,请转到蜘蛛文件并找到以下函数:

def parse(self, response):
    pass

替换pass为执行必要功能的代码。在我们的例子中,它涉及从标签中提取数据h1:文章来源地址:https://www.yii666.com/learning/Python/310.html

def parse(self, response):
    item = DemoItem()
    item["text"] = response.xpath("//h1").extract()
    return items

之后,您可以在项目中配置蜘蛛程序的执行并获取所需的数据。

Selemium

Selenium是一个非常方便的库,它不仅允许您提取数据和抓取简单的网页,还允许使用无头浏览器。这使得它适合抓取动态网页。因此,我们可以说 Selenium 是 Python 中最好的网页抓取库之一。

特征

Selenium 库最初是为了软件测试目的而开发的,这意味着它允许您有效地模仿真实用户的行为。此功能降低了网页抓取期间阻塞的风险。此外,Selenium 允许收集数据并在网页上执行必要的操作,例如身份验证或填写表单。

该库使用一个网络驱动程序来提供对这些功能的访问。您可以选择任何受支持的网络驱动程序,但 Firefox 和 Chrome 网络驱动程序是最受欢迎的。本文将以 Chrome Web 驱动程序为例。

安装

让我们从安装库开始:文章来源地址https://www.yii666.com/learning/Python/310.html

pip install selenium

另外,如前所述,我们需要一个 Web 驱动程序来模拟真实用户的行为。我们只需要下载它并将其放在任意文件夹中即可使用。稍后我们将在代码中指定该文件夹的路径。

您可以从官方网站下载网络驱动程序。请记住,使用与您所安装的浏览器版本相对应的网络驱动程序版本非常重要。

使用示例

要使用 Selenium 库,请创建一个空的 *.py 文件并导入必要的库:

from selenium import webdriver
from selenium.webdriver.common.by import By

之后,让我们指定网络驱动程序的路径并定义我们将使用它:

DRIVER_PATH = 'C:\chromedriver.exe'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)

在这里您还可以指定一些参数,例如操作模式。浏览器可以在活动模式下运行,您将在其中看到所有脚本的操作。或者,您可以选择无头模式,其中浏览器窗口被隐藏并且不向用户显示。默认情况下会显示浏览器窗口,因此我们无需更改任何内容。

现在我们已经完成了设置,让我们进入登陆页面:

driver.get("https://example.com/")

此时,网络驱动程序将启动,您的脚本将自动转到所需的网页。现在我们只需指定要检索的数据、显示检索到的数据并关闭 Web 驱动程序:

text = driver.find_elements(By.CSS_SELECTOR, "h1")
print(text)
driver.close()

重要的是不要忘记在脚本执行结束时关闭 Web 驱动程序。否则,它将保持打开状态直到脚本完成,这可能会严重影响电脑的性能。 

Pyppeteer

我们将在文章中讨论的最后一个库是Pyppeteer。它是一个名为 Puppeteer 的流行库的 Python 版本,常用于 NodeJS。Pyppeteer 拥有充满活力的社区和详细的文档,但不幸的是,其中大部分都集中在 NodeJS 上。因此,如果您决定使用这个库,请务必记住这一点。 

特征

如前所述,这个库最初是为 NodeJS 开发的。它还允许您使用无头浏览器,这使得它对于抓取动态网页非常有用。

安装

要安装该库,请转到命令行并输入命令:

pip install pyppeteer

通常,该库与asyncio库一起使用,可以提高脚本性能和执行速度。那么,我们也来安装它:

pip install asyncio

除此之外,我们不需要任何其他东西。 

使用示例

让我们看一个使用 Pyppeteer 库的简单示例。我们将创建一个新的 Python 文件并导入必要的库来执行此操作。

import asyncio
from pyppeteer import launch

现在,让我们执行与上一个示例相同的操作:导航到页面,收集数据,将其显示在屏幕上,然后关闭浏览器。

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://example.com')
    text = await page.querySelectorAll("h1.text")
    print(await text.getProperty("textContent"))
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

由于这个库与 Puppeteer 类似,初学者可能会觉得有些挑战性。

最佳实践和注意事项

为了使网络抓取更加高效,需要遵循一些规则。遵守这些规则有助于使您的抓取工具更加有效和道德,并减少您从中收集信息的服务的负载。 

避免过多的请求

在网络抓取过程中,避免过多的请求对于防止被阻止并减少目标网站的负载非常重要。这就是为什么建议在最不繁忙的时间(例如晚上)从网站收集数据。这有助于降低资源过载并导致其故障的风险。 

处理动态内容

在收集动态数据的过程中,有两种方法。您可以使用支持无头浏览器的库自行进行抓取。或者,您可以使用网络抓取 API,该 API 将为您处理收集动态数据的任务。

如果您有良好的编程技能和一个小项目,那么使用库编写自己的抓取工具可能会更好。但是,如果您是初学者或需要从多个页面收集数据,则网络抓取 API 会更好。在这种情况下,除了收集动态数据之外,API 还将负责代理和解决验证码,例如scrape it cloud serp api。

用户代理轮换

同样重要的是要考虑到您的机器人在不使用用户代理的情况下也会引人注目。每个浏览器在访问网页时都有自己的用户代理,您可以在开发者控制台的 DevTools 选项卡下查看它。建议为每个请求随机更改用户代理值。

代理使用和 IP 轮换

正如我们之前讨论过的,抓取时存在被阻止的风险。为了降低这种风险,建议使用隐藏真实 IP 地址的代理。

然而,只有一个代理是不够的。最好有轮换代理,尽管它们的成本较高。

结论和要点

本文讨论了用于网页抓取的库和以下规则。总而言之,我们创建了一个表格并比较了我们涵盖的所有库。

下面的比较表重点介绍了用于网页抓取的 Python 库的一些关键功能:

图书馆

解析能力

高级功能

JS渲染

使用方便

Scrape-It.Cloud

HTML、XML、JavaScript

自动抓取和分页

是的 

简单的

Requests 和 BeautifulSoup 组合

HTML、XML

简单集成

简单的

Requests 和 LXML 组合

HTML、XML

XPath 和 CSS 选择器支持

缓和文章地址https://www.yii666.com/learning/Python/310.html

Scrapy

HTML、XML

多个蜘蛛

缓和

Selenium

HTML、XML、JavaScript

动态内容处理网址:yii666.com<

是(使用网络驱动程序)

缓和

Pyppeteer

HTML、JavaScript

使用无头 Chrome 或 Chromium 进行浏览器自动化

是的

缓和

总的来说,Python 是一种非常有用的数据收集编程语言。凭借其广泛的工具和用户友好的性质,它通常用于数据挖掘和分析。Python 可以轻松完成与从网站提取信息和处理数据相关的任务。



其他相关文章
    领支付宝红包赞助服务器费用
    如何防止 PHP 中的 SQL 注入?
    微信公众号:小猪波罗蜜
    关注公众号,回复999,可联系站长解答疑问哦。每天分享更多有趣的事儿,有趣有料!
    99人已关注

    觉得文章有用就打赏一下文章作者

    支付宝扫一扫打赏

    微信图片_20190322181744_03.jpg

    微信扫一扫打赏

    请作者喝杯咖啡吧~

    支付宝扫一扫领取红包,优惠每天领

    二维码1

    zhifubaohongbao.png

    二维码2

    zhifubaohongbao2.png