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

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

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

刮板示例可以很容易地扩展并用作您个人项目的可靠层,用于从网络上抓取和抓取数据。

先决条件

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

第 1 步 — 创建 Amazon 基本 Scraper

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

ProxyCrawl 有一个 pyhton 抓取库; 结合scrapy,我们保证我们的爬虫大规模匿名运行而不会被网站阻止。 代理爬取 API 是一个强大的薄层,可作为薄中间件在任何站点之上运行。

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

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

1
点安装代理爬行
1
pip安装scrapy

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

1
mkdir amazon-scraper

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

1
cd amazon-scraper

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

1
触摸 myspider.py

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

将以下代码粘贴到 myspider.py

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

proxycrawl.proxycrawl_api 进口 ProxyCrawlAPI

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

亚马逊蜘蛛(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']
# 使 URLs 通过 ProxyCrawl API
开始网址 = 名单(地图(拉姆达 网址:api.buildURL({ '网址': 网址}), 网址))


运行尚未提取数据的刮板,但您应该将其指向 ProxyCrawl API Endpoint 并获取 Crawled 200 来自 Scrapy。

1
scrapy runpider myspider.py

结果应该是这样的,注意通过 ProxyCrawl 向亚马逊结果页面的请求传递了 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 (默认, May 1 2018, 16:44:37) - [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0h 27 Mar 2018),密码学 2.2.2,平台 Darwin-16.7.0-x86_64-i386-64bit
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.proxycrawl.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 这只是通过 ProxyCrawl API 指向亚马逊搜索结果的一个 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
19
20
进口 scrapy

proxycrawl.proxycrawl_api 进口 ProxyCrawlAPI

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

亚马逊蜘蛛(scrapy.Spider):
姓名 = '亚马逊蜘蛛'
# 亚马逊搜索结果 URL
网址 = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=cold-brew+coffee+makers&page=1']
# 使 URLS 通过 PROXYCRAWL 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.proxycrawl.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.proxycrawl.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 冷酿咖啡机,拉丝不锈钢'}
...

结果和总结

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

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