Scrapy 是 Python 开发的一个快速,高层次的屏幕抓取和 web 抓取框架,用于抓取 web 站点并从页面中提取结构化的数据。Scrapy 用途广泛,可以用于数据挖掘、监测和自动化测试。本文作者 Erdem İşbilen 为我们演示了如何使用 Python 和 Scrapy 怎样在半个小时内对 10 个在线商店抓取信息。有了 Python 和 Scrapy,我们就可以完成大量的工作,而不需要自己费大力气去开发。
获取启动 App 项目所需的源数据是一步。即便你是全栈开发人员,希望开发一款出色的 Web 应用程序,并能全身心投入到项目中。在编写代码之前,仍然需要一个与领域相关的数据集。这是因为现代应用程序会同时或成批处理大量数据,以便为其用户提供价值。本文,我将解释生成这样一个数据集的工作流程。你将会看到,我在没有任何人工干预的情况下是如何对许多网站进行自动网页抓取的。
我的目标是为价格比较网络应用程序生成一个数据集。我将使用的产品类别以手提袋为例。对于这样的应用,应该每天从不同的在线商店那里收集手提包的产品信息和价格信息。尽管有些在线商店提供了 API 让你访问所需的信息,但并非所有在线商店都会这么做。所以,网页抓取不可避免。
在本文的示例中,我将使用 Python 和 Sparky 为 10 个不同的在线商店生成网络蜘蛛(Web spider)。然后,我将使用 Apache Airflow 自动化这一过程,这样就不需要人工干预来定期执行整个过程。
源代码和现场演示 Web 应用程序
你可以在 GitHub 仓库 找到所有相关的源代码,也可以访问在线 Web 应用程序,使用的是网页抓取项目提供的数据。
在开始任何网页抓取项目之前,必须先定义哪些网站将包含在项目中。我决定抓取 10 个网站,这些网站是土耳其手提包类别中访问量最大的在线商店。
步骤 1:安装 Scrapy 并设置项目文件夹
在创建 Scrapy 蜘蛛之前,必须将 Scrapy 安装到计算机中,并生成 Scrapy 项目。请查看下面的帖子了解更多的信息。
Fuel Up the Deep Learning: Custom Dataset Creation with Web Scraping (推动深度学习:使用网页抓取创建自定义数据集)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
项目文件夹和文件
项目的文件夹结构
我在本地计算机上创建了一个文件夹结构,将项目文件整齐地放入不同文件夹。csvFiles
文件夹包含了每个被抓取的网站的 CSV 文件。网络蜘蛛将从那些 CSV 文件中读取“起始 URL”来启动网页抓取,因为我不想在网络蜘蛛中对它们进行硬编码。
fashionWebScraping
文件夹包含 Scrapy 蜘蛛和助手脚本,比如 settings.py
、item.py
和 pipelines.py
。我们必须修改其中一些 Scrapy 助手脚本,才能成功执行网页抓取过程。
抓取的产品图像将保存在 images_scraped
文件夹中。
在网页抓取过程中,所有的产品信息,如价格、名称、产品链接和图像链接都将存储在 jsonFiles
文件夹中的 JSON 文件中。
deldub.py
用于在网页抓取结束后,检测并删除 JSON 文件中重复的产品信息。jsonPrep.py
是另一个实用程序脚本,用于在网页抓取结束后,检测并删除 JSON 文件中的空行项。deleteFiles.py
可删除在上一次网页抓取会话中生成的所有 JSON 文件。jsonToes.py
通过读取 JSON 文件,在远程位置填充 ElasticSearch 集群。这是提供实施全文搜索体验所必需的。sitemap_gen.py
用于生成涵盖所有产品链接的站点地图。
步骤 2:理解特定网站的 URL 结构并为起始 URL 填充 CSV 文件
创建项目文件夹后,下一步就是使用我们要抓取的每个网站的起始 URL 来填充 CSV 文件。几乎所有的电子商务网站都提供分页功能,以便通过产品列表为用户导航。每次导航到下一页时,URL 中的 page
参数都会增加。请参见下面的示例 URL,其中使用了 page
参数。
|
我将使用 {}
占位符,这样就可以通过增加 page
的值来对 URL 进行迭代。我还将使用 CSV 文件中的 gender
列来定义特定 URL 的性别类别。
因此,最终的 CSV 文件看起来如下图所示:
同样的原则,也适用于项目中的其他网站,可以在我的 GitHub 仓库中找到已填充的 CSV 文件。
步骤 3:修改 items.py
和 settings.py
文件
要开始网页抓取,我们必须修改 items.py
来定义用于存储抓取数据的 item objects
。
为了定义通用输出数据格式,Scrapy 提供了
Item
类。Item