发布于 2026-01-06 6 阅读
0

网络爬虫:使用 Scrapy 和 Scraper API 管理代理和验证码

网络爬虫:使用 Scrapy 和 Scraper API 管理代理和验证码

原文发表于我的网站

在本系列的第一部分第二部分中,我们介绍了网络爬虫以及实现此任务可以应用的技术。我们使用了 BeautifulSoup 和 Selenium 这两个 Python 库。如果您还没有了解过它们,不妨去看看。

在本网络爬虫系列的最后一部分中,我们将探索 Scrapy 库、爬虫 API,并了解使用这些工具的必要性。

在本教程中,我们将从MovieDB网站抓取数据。这只是一个示例,如果您需要他们的任何数据,他们也提供了 API。您可以在GitHub上找到代码

为什么叫 Scrapy?

Scrapy 是一个开源的 Python 库。
它允许你并发抓取网站,而无需处理线程、进程、同步或其他任何相关问题。它异步处理你的请求,速度非常快。如果你想在自定义爬虫中实现类似的功能,则需要自行实现或使用一些异步库。

有关此主题的更多详细信息,请查看此帖子

为什么选择 Scraper API?

请注意,以下部分链接为联盟链接,您无需支付任何额外费用。我只会推荐我亲自使用过且真心认为有用的产品、工具和学习服务。最重要的是,我绝不会建议您购买超出您经济能力范围或您尚未准备好实施的产品。

Scraper API 是一家专注于提供安全策略的初创公司,旨在帮助您在进行网页抓取时避免 IP 地址被屏蔽。他们利用 IP 地址轮换技术来规避检测,拥有超过 2000 万个 IP 地址和无限带宽。
此外,他们还提供 CAPTCHA 处理服务,并支持启用无头浏览器,让您看起来像一个真实用户,从而避免被检测为网页抓取工具。Scraper API 的
使用不仅限于 Scrapy,还支持 Python 生态系统中的 requests、BeautifulSoup 和 Selenium 等工具。他们也支持与其他常用平台(例如 Node.js、Bash、PHP 和 Ruby)集成。您只需在 HTTP GET 请求中将目标 URL 与其 API 端点连接起来,然后像使用其他网页抓取工具一样进行操作即可。在本教程中,我将详细介绍具体操作方法😁

使用此爬虫API链接和优惠码lewis10,首次购买即可享受10%折扣!
您可以先使用他们慷慨的免费套餐,需要时再升级。

1.设置

首先,我们需要安装 Scrapy 库。运行

pip install scrapy
Enter fullscreen mode Exit fullscreen mode

之后,前往爬虫API网站获取API密钥。我们需要用它来轻松访问他们的服务。请耐心等待。

启动该项目

完成这两个步骤后,我们就应该可以开始创建网络爬虫了。
运行python scrapy startproject projectName

这将创建我们的项目,该项目将按以下结构初始化。
替代文字

现在到了有趣的部分
,我们将在爬虫的文件夹中创建一个名为 movies.py 的文件。
这个文件将包含运行我们网络爬虫所需的大部分代码。

我们的全部代码将如下所示。

from scrapy import Spider
from ..items import GetmoviesItem
from .config import API_KEY

class moviesCrawl(Spider):
    name="movies"
    page_number=15

    url_link="https://www.themoviedb.org/movie?page=1"

    start_urls=['http://api.scraperapi.com/?api_key='+ API_KEY + '&url=' + url_link + '&render=true']

    def parse(self,response):
        movies=response.css("div.item.poster.card")
        items=GetmoviesItem()
        for movie in movies:
            items["title"]=movie.css('.title.result::text').extract()
            items["rating"]=movie.css(".user_score_chart::attr(data-percent)").extract()
            items["description"]=movie.css(".overview::text").extract()
            items["poster_link"]=movie.css('.poster.lazyload.fade::attr(data-src)').extract()

            yield items


        next_page_url = "https://www.themoviedb.org/movie?page="+ str(self.page_number)
        next_page='http://api.scraperapi.com/?api_key='+ API_KEY + '&url='+ next_page_url + '&render=true'

        if self.page_number<=15:
            self.page_number+=1
            yield response.follow(next_page,callback=self.parse)
Enter fullscreen mode Exit fullscreen mode

看起来可能有点吓人,但我们会逐行分析。

前三行是库导入和我们需要用来有效创建一个功能齐全的网络爬虫的项。

from scrapy import  Spider
from ..items import GetmoviesItem
from .config import API_KEY
Enter fullscreen mode Exit fullscreen mode

目前,暂时不用担心 GetmoviesItem 的导入,我们稍后会讲到。
我创建了一个单独的文件来存储所有需要的配置信息。在这个例子中,配置
信息是我们从爬虫 API 获取的 API 密钥。

class moviesCrawl(Spider):
    name="movies"

    url_link="https://www.themoviedb.org/movie?page=1"
    page_number=15

    start_urls=['http://api.scraperapi.com/?api_key='+ API_KEY + '&url=' + url_link + '&render=true']

Enter fullscreen mode Exit fullscreen mode

接下来事情开始变得有趣起来。我们首先创建 moviesCrawl 类,它继承自文件顶部导入的 spider 类。这个类将构成我们网络爬虫的基础,我们将从这里开始定义网络爬虫的行为。

首先,我们需要给它起个名字,这个名字存储在 names 变量中。创建完成后,当我们运行爬虫程序时,就会用到这个名字。

至于 url_link 变量,它只是指向我们要抓取的 URL。你会注意到这是一个分页网站,其格式为:

https://www.themoviedb.org/movie?page={{page_number}}

page_number 变量将利用此模式自动将抓取程序移动到目标网站内的多个页面。

最后,`start_urls` 变量是 Scrapy 中的一个关键字。它是一个 URL 列表,当没有指定具体的 URL 时,爬虫将从列表中开始抓取。因此,最先下载的页面将是列表中列出的那些。

为了使我们能够使用抓取工具 API 并充分发挥其功能 😎,我们只需将我们的 url_link 与抓取工具 API 端点连接起来即可。

http://api.scraperapi.com/?api_key='+ API_KEY + '&url=' + url_link + '&render=true

`render=true` 选项的作用是告诉爬虫 API 启用 JavaScript 渲染,从而允许无头浏览器运行。这和我们之前用Selenium讲解的内容类似,只是形式更简化一些。

def parse(self,response):
        movies=response.css("div.item.poster.card")
        items=GetmoviesItem()
        for movie in movies:
            items["title"]=movie.css('.title.result::text').extract()
            items["rating"]=movie.css(".user_score_chart::attr(data-percent)").extract()
            items["description"]=movie.css(".overview::text").extract()
            items["poster_link"]=movie.css('.poster.lazyload.fade::attr(data-src)').extract()

            yield items
Enter fullscreen mode Exit fullscreen mode

根据 Scrapy 的文档,

parse 方法负责处理响应并返回抓取的数据和/或更多要跟踪的 URL。

简单来说,这意味着我们可以利用这种方法来操控从目标网站抓取的数据。在前两篇教程中,我们将网络抓取定义为……

网络爬虫是指利用网页底层代码中的模式从网页中提取信息的过程。
我们可以使用网络爬虫从互联网收集非结构化数据,对其进行处理并以结构化格式存储。

一旦我们识别出网页代码中的模式,就可以自动提取数据。现在让我们来检查这些 DOM 元素。

电影数据库

从上图可以看出,每个电影条目都包含在一个带有 item、poster 和 card 类名的 div 元素中。
有了这些信息,我们将指示爬虫程序获取所有具有这些属性的 CSS 元素。

在继续之前,让我们先处理一下我们在脚本开头导入的 GetmoviesItem 类。

from scrapy import Item
class GetmoviesItem(scrapy.Item):
    # define the fields for your item here like:
    title=scrapy.Field()
    rating=scrapy.Field()
    description=scrapy.Field()
    poster_link=scrapy.Field()
Enter fullscreen mode Exit fullscreen mode

抓取网站数据后,我们需要将数据以结构化格式存储在某个地方。这些 items 对象是用于收集抓取数据的简单容器。它们提供类似字典的 API,语法简洁易懂,方便声明其可用字段。更多信息请点击此处
查看

从上面的代码可以看出,我们定义的变量将像字典的键一样,存储我们提取的信息。

我们进展顺利吗?很好。继续前进。

items 变量是 GetmoviesItem 的一个实例。接下来,我们使用与字典键相同的字段名,从每部电影中提取各个属性。例如,评分信息存储在一个名为 user_score_chart 的元素中。在这个 HTML 元素中,我们有一个名为“data-percent”的属性,因此我们使用 attr 方法来访问其中存储的数据。然后,使用 yield 函数,我们就可以获取所需的所有数据了。

代码的最后一部分是:

        next_page_url = "https://www.themoviedb.org/movie?page="+ str(self.page_number)
        next_page='http://api.scraperapi.com/?api_key='+ API_KEY + '&url='+ next_page_url + '&render=true'

        if self.page_number<=15:
            self.page_number+=1
            yield response.follow(next_page,callback=self.parse)
Enter fullscreen mode Exit fullscreen mode

我们利用分页 URL 来遍历任意数量的页面。幸运的是,由于我们将连接到爬虫 API 的端点,因此无需担心 IP 地址被屏蔽,因为他们已经为我们管理了代理。
但是,我建议在进行网页抓取时不要向目标网站发送过多的请求,因为这可能会影响其他用户在该平台上的体验。

最后,存储信息也很简单,只需根据您选择的文件格式运行以下任何命令即可。

scrapy crawl movies -o filename.csv

scrapy crawl movies -o filename.json

scrapy crawl movies -o filename.xml

特征评估

代理功能

我使用httpbin测试了这个功能,在多次请求中,IP 轮换效果非常好。 需要注意的是,IP 轮换期间请求速度会变慢,因此你的网页爬虫运行速度会比平时慢一些。
代理

验证码

要测试此功能,请找到一个启用了验证码的网站并运行脚本。TruePeopleSearch 就是一个很好的例子它会立即弹出验证码表单。你会发现,抓取工具 API 可以轻松处理验证码,让你像往常一样进行抓取操作。

无头浏览器

移除 render=true 后,在一个大量使用 JavaScript 的网站上运行脚本,并观察差异。
一个很好的起点是参考“抓取 JavaScript 驱动的网站”这篇文章

结论

希望您也能使用 Scrapy 制作一个简单的网络爬虫,并利用爬虫 API。

想了解更多相关信息,请访问他们的文档页面,查看他们提供的强大功能,这些功能可以缓解您在网络抓取过程中遇到的一些难题。

scrapy 文档

感谢您的阅读。
如果您想阅读更多此类内容,请订阅我的电子报,以便在我发布新文章时收到通知。想和我聊天吗?欢迎在推特上联系我。

文章来源:https://dev.to/lewiskori/web-scraping-managing-proxies-and-captcha-with-scrapy-and-the-scraper-api-2c5b