网络爬行,也称为网络蜘蛛或屏幕抓取,软件开发人员将其定义为“编写软件来迭代一组网页以提取内容”,是出于各种原因从网络中提取数据的绝佳工具。

使用 网络爬虫,您可以抓取网页以从一组文章中抓取数据,挖掘大型博客文章或从亚马逊抓取定量数据以进行价格监控和机器学习,克服无法从没有官方 API 的网站获取内容的问题,或者简单地为下一个更好的网络构建您自己的原型。

在本教程中,我们将教您使用 Crawlbase 和 Scrapy 进行爬行和抓取的基础知识。例如,我们将使用亚马逊搜索结果页面来提取产品 ASIN URL 和标题。完成本教程后,您将有望拥有一个功能齐全的网络抓取工具,它可以运行亚马逊上的一系列页面,从每个页面提取数据,并将其打印到您的屏幕上。

抓取器示例可以轻松扩展并用作从网络上爬行和抓取数据的个人项目的坚实层。

博客目标:

  • 了解 Scrapy 框架、其功能、架构和操作。
  • 学习创建自己的 亚马逊刮刀 在 Python Scrapy 中使用 Crawlbase。
  • 了解如何从亚马逊搜索结果页面中提取亚马逊产品页面的基础知识。

先决条件

要成功完成本教程,您需要 Crawlbase API 免费令牌 用于匿名抓取网页,并在本地机器上安装 Python 3 进行开发。

第 1 步 — 创建 Amazon 基本 Scraper

Scrapy 是一个 Python 抓取库; 它包括大多数在抓取时可以帮助我们的常用工具。 它加快了抓取过程,并由一个喜欢抓取和抓取网络的开源社区维护。

Crawlbase有一个Python抓取库;结合scrapy,我们保证我们的爬虫大规模匿名运行,不会被网站屏蔽。 Crawlbase API 是一个功能强大的薄层,可作为薄中间件运行在任何站点之上。

Crawlbase 和 Scrapy 在 PyPI(称为 pip)上有 Python 包。 的PyPIPython 包管理器由 Python 社区维护,作为开发人员所需的各种库的存储库。

使用以下命令安装 Crawlbase 和 Scrapy:

1
点安装爬虫库
1
pip安装scrapy

为刮刀创建一个新文件夹:

1
mkdir 亚马逊爬虫

导航到您在上面创建的刮板目录:

1
cd 亚马逊爬虫

为你的爬虫创建一个 Python 文件。 本教程的所有代码都将放在这个文件中。 我们在本教程的控制台中使用 Touch 命令,您可以使用您喜欢的任何其他编辑器。

1
触摸 myspider.py

让我们创建我们的第一个基本的scrapy spider AmazonSpider 继承自 scrapy.Spider. 根据 scrapy 文档,子类有 2 个必需的属性。 这 name 这是我们的蜘蛛的名称和 URL 列表 start_urls,我们将在此示例中使用一个 URL。我们还导入了 Crawlbase API,以便我们可以构建将通过 Crawlbase API 的 URL,而不是直接访问原始站点,以避免阻止和验证码页面。

将以下代码粘贴到 myspider.py

1
2
3
4
5
6
7
8
9
10
11
进口 scrapy

crawlbase.crawlbase_api 进口 抓取API

# 从 Crawlbase 获取 API 令牌并将其替换为 YOUR_TOKEN
api = 爬行API({ '令牌': '你的令牌' })

亚马逊蜘蛛(scrapy.Spider):
姓名 = '亚马逊蜘蛛' # 用于提取 ASIN 页面和标题的亚马逊搜索结果 URL
网址 = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=cold-brew+coffee+makers&page=1'] # 让 URL 通过 Crawlbase API
开始网址 = 名单(地图(拉姆达 网址:api.buildURL({ '网址': 网址}), 网址))

运行尚未提取数据的抓取工具,但您应该将其指向 Crawlbase API 端点并获取 Crawled 200 来自 Scrapy。

1
scrapy runpider myspider.py

结果应该是这样的,请注意,通过 Crawlbase 对 Amazon 结果页面的请求通过了 200 响应代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2018-07-09 02:05:23 [scrapy.utils.log] 信息:Scrapy 1.5.0 开始(机器人:scrapybot)
2018-07-09 02:05:23 [scrapy.utils.log] 信息:版本:lxml 4.2.3.0、libxml2 2.9.8、cssselect 1.0.3、parsel 1.5.0、w3lib 1.19.0、Twisted 18.4.0 ,Python 2.7.15(默认,1 年 2018 月 16 日,44:37:4.2.1)-[GCC 9.0.0 兼容 Apple LLVM 900.0.39.2 (clang-18.0.0)],pyOpenSSL 1.1.0(OpenSSL 27h 2018 月 2.2.2 日) 16.7.0),密码学 86,平台 Darwin-64-x386_64-iXNUMX-XNUMXbit
2018-07-09 02:05:23 [scrapy.crawler] 信息:覆盖设置:{'SPIDER_LOADER_WARN_ONLY': True}
2018-07-09 02:05:23 [scrapy.middleware] 信息:启用扩展:
...
2018-07-09 02:05:23 [scrapy.core.engine] 信息:蜘蛛打开
2018-07-09 02:05:23 [scrapy.extensions.logstats] 信息:抓取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)
2018-07-09 02:05:23 [scrapy.extensions.telnet] 调试:Telnet 控制台监听 127.0.0.1:6023
2018-07-09 02:05:25 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://api.crawlbase.com/?token=TOKEN_HIDDEN&url=https%3A%2F%2Fwww.amazon.com%2Fs%2Fref%3Dnb_sb_noss%3Furl%3Dsearch-alias%253Daps%26field-keywords%3Dcold-brew%2Bcoffee%2Bmakers%26page%3D1&> (referer: None)
NotImplementedError:未定义 AmazonSpider.parse 回调
2018-07-09 02:05:25 [scrapy.core.engine] 信息:关闭蜘蛛(已完成)
2018-07-09 02:05:25 [scrapy.statscollectors] 信息:倾销 Scrapy 统计数据:
{'downloader/request_bytes': 390,
'下载者/request_count': 1,
'downloader/request_method_count/GET': 1,
“下载器/响应字节”:146800,
'下载者/response_count': 1,
...
'start_time': datetime.datetime(2018, 7, 8, 23, 5, 23, 681766)}
2018-07-09 02:05:25 [scrapy.core.engine] 信息:蜘蛛关闭(完成)

由于我们还没有编写解析器,所以代码只是加载了 start_urls 这只是通过 Crawlbase API 访问 Amazon 搜索结果的一个 URL,并将结果返回到默认解析器,该解析器默认情况下不执行任何操作。现在是时候进行下一步并编写简单的解析器来提取我们需要的数据了。

第 2 步 - 抓取 Amazon ASIN URL 和标题

让我们增强 myspider 类具有一个简单的解析器,可提取搜索结果页面上所有 ASIN 产品的 URL 和标题。 为此,我们需要知道我们需要使用哪些 css 选择器来指示scrapy 从这些标签中获取数据。 在编写本教程时。 ASIN URL 位于 .a-link-normal css 选择器

使用我们的简单解析器增强蜘蛛类将为我们提供以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
进口 scrapy

crawlbase.crawlbase_api 进口 抓取API

# 从 Crawlbase 获取 API 令牌并将其替换为 YOUR_TOKEN
api = 爬行API({ '令牌': '你的令牌' })

亚马逊蜘蛛(scrapy.Spider):
姓名 = '亚马逊蜘蛛' # 亚马逊搜索结果 URL
网址 = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=cold-brew+coffee+makers&page=1'] # 使 URL 通过 Crawlbase API
开始网址 = 名单(地图(拉姆达 网址:api.buildURL({ '网址': 网址}), 网址))

DEF 解析(自我,回应):
链接 in 响应.css('li.s-结果项'):
产量 {
'网址':链接.css('aa-link-normal.a-text-normal ::attr(href)').extract_first(),
'标题':链接.css('aa 链接正常 :: 文本').extract_first()
}

再次运行 scrapy 应该会为我们打印一些很好的 ASIN 页面 URL 及其标题。 😄

1
2
3
4
5
6
...
2018-07-09 04:01:18 [scrapy.core.scraper] DEBUG: Scraped from <200 https://api.crawlbase.com/?token=TOKEN_HIDDEN&url=https%3A%2F%2Fwww.amazon.com%2Fs%2Fref%3Dnb_sb_noss%3Furl%3Dsearch-alias%253Daps%26field-keywords%3Dcold-brew%2Bcoffee%2Bmakers%26page%3D1&>
{'url':'https://www.amazon.com/Airtight-Coffee-Maker-Infuser-Spout/dp/B01CTIYU60/ref=sr_1_5/135-1769709-1970912?ie=UTF8&qid=1531098077&sr=8-5&keywords= cold-brew+coffee+makers', 'title': '密封冷泡冰咖啡壶和茶壶带壶嘴 - 1.0L/34oz 椭圆形 RJ3 酿造玻璃水瓶,带可拆卸不锈钢过滤器'}
2018-07-09 04:01:18 [scrapy.core.scraper] DEBUG: Scraped from <200 https://api.crawlbase.com/?token=TOKEN_HIDDEN&url=https%3A%2F%2Fwww.amazon.com%2Fs%2Fref%3Dnb_sb_noss%3Furl%3Dsearch-alias%253Daps%26field-keywords%3Dcold-brew%2Bcoffee%2Bmakers%26page%3D1&>
{'url':'https://www.amazon.com/KitchenAid-KCM4212SX-Coffee-Brushed-Stainless/dp/B06XNVZDC7/ref=sr_1_6/135-1769709-1970912?ie=UTF8&qid=1531098077&sr=8-6&keywords=冷酿+咖啡+制造商','标题':'KitchenAid KCM4212SX 冷酿咖啡机,拉丝不锈钢'}
...

Python Scrapy Web Scraper 框架的架构

Scrapy网络爬虫是用Python精心创建的一个强大的开源网络爬虫框架。深受喜爱 刮板机 对于开发人员来说,Scrapy 可以指导他们以无与伦比的效率从网站中提取数据和进行网页抓取。

当一个项目启动时,几个文件开始与 Scrapy 的主要组件交互。观察 Scrapy 框架表明,其核心元素(引擎)负责四个关键组件的功能:

  • 蜘蛛
  • 项目管道
  • 下载器
  • 调度器

让我们将他们的工作分为几个简单的步骤:

  1. 在Scrapy网络抓取的初始阶段,通过Spiders促进通信。这些蜘蛛充当定义各种抓取方法的类。用户调用这些方法,允许 Scrapy 网络抓取工具向引擎传输请求,包括要抓取的 URL 和需要提取的信息。 Scrapy 引擎在控制整个数据流并在整个抓取过程中触发重要事件方面发挥着至关重要的作用。它充当整个操作的管理者。
  2. 一旦引擎收到请求,它就会被定向到调度程序,调度程序管理要执行的任务的顺序。如果提供了多个 URL,调度程序会将它们排入队列进行处理。
  3. 引擎还接收来自调度程序的请求,调度程序已预先安排了任务。然后这些请求被发送到下载器模块。 Downloader的工作是获取指定网页的HTML代码并将其转换为Response对象。
  4. 随后,Response对象被移交给Spider,并调用Spider类中定义的特定抓取方法。然后,处理后的数据将移至 ItemPipeline 模块,在此发生连续的转换步骤。这些步骤可能包括清理、数据验证或插入数据库。

总而言之,Scrapy框架中的关键组件包括Spiders(定义抓取方法)、Scrapy Engine(控制数据流)、Scheduler(管理任务顺序)、Downloader(获取网页内容)和ItemPipeline(应用转换步骤来提取数据)。每个组件在确保高效且有组织的 Scrapy 网页抓取过程中都发挥着至关重要的作用。

为什么 Scrapy 应该是你的首选?

当您必须抓取网页时,Scrapy 网络抓取工具因几个令人信服的原因而成为无与伦比的选择。让我们讨论一下 Scrapy 的功能,并了解为什么它应该成为您首选的网络抓取工具。

多功能

Scrapy 网络抓取工具的与众不同之处在于其固有的多功能性和灵活性。该框架优雅地克服了网页的障碍,解决了数据提取的复杂性。对于那些以网络抓取为食和呼吸的人来说,它是一个可靠的伴侣,使这个过程既方便又高效。

轻松网页抓取

Scrapy 框架擅长以最精确的方式抓取网页。 Scrapy 提供了一种简单且用户友好的方法来抓取网页,使开发人员能够专注于提取逻辑而不是困难的技术细节。

无论您是浏览网站的复杂结构还是提取数据,Scrapy 都能提供流畅的体验。它简化了浏览网页的复杂任务,使其成为初学者和专家开发人员的理想伴侣。

Python 简化

在编程语言界,Python以其简单性和可读性而闻名。 Scrapy 作为一个基于 Python 的框架,继承了这些品质。这使得它成为那些开始网络抓取的人的绝佳选择。对 Scrapy 中 Python 代码的熟悉程度确保了更平滑的学习曲线和更具表现力的环境来构建抓取逻辑。

Scrapy 提供了如此惊人的功能,可以简化您抓取网页的方式。从发起请求到解析和存储数据,Scrapy 巧妙地简化了每个步骤。它提供了一个全面的框架,用于构建为各种抓取项目定制的可扩展且高效的蜘蛛。

Scrapy 代理支持的匿名性

在网络抓取中保持匿名性至关重要,而 Scrapy 在这方面表现出色。通过内置的代理支持,Scrapy 可确保您的爬虫保持隐身状态。在处理 IP 禁令或验证码时,此功能非常有用,它提供了强大的解决方案来克服抓取过程中的潜在障碍。这种 Scrapy 代理支持为您的抓取过程增加了一层额外的弹性。

强大的网页抓取功能

Scrapy 网页抓取工具是强大的网页抓取功能的代名词。它简化了从发送请求到解析和存储数据的整个过程。其效率和可靠性使其成为从不同网站提取数据的不可或缺的工具,并提供一致和强大的性能。无论您是初学者开发人员还是在该领域拥有 10 年的经验,Scrapy proxy 都可以为您提供轻松浏览大量 Web 数据所需的工具。其基于组件的架构鼓励定制,允许开发人员创建他们的抓取工作流程以满足特定的项目要求。

结果和总结

在本教程中,我们学习了网络爬行和抓取的基础知识,并使用 Crawlbase API 与 Scrapy 结合使用,以确保我们的抓取工具不会被可能阻止我们请求的网站检测到。我们还学习了如何从亚马逊搜索结果页面中提取亚马逊产品页面的基础知识。您可以将示例更改为您需要的任何网站,并开始使用 Scrapy 和 Crawlbase 匿名抓取数千个页面。

我们希望你喜欢这个教程,我们希望很快见到你 爬虫库. 快乐的爬行和刮擦!