scrapy分页抓取网页(初窥ScrapyScrapy背后的概念与工作原理(一))
优采云 发布时间: 2022-01-11 02:16scrapy分页抓取网页(初窥ScrapyScrapy背后的概念与工作原理(一))
初步了解 Scrapy
Scrapy 是一个应用程序框架,用于抓取 网站 数据并提取结构化数据。它可以用于一系列程序,包括数据挖掘、信息处理或存储历史数据。
它最初是为网络抓取(更准确地说,网络抓取)而设计的,但也可用于获取 API(例如 Amazon Associates Web Services)或通用网络爬虫返回的数据。
本文档将通过介绍其背后的概念,让您了解 Scrapy 的工作原理,并决定 Scrapy 是否是您所需要的。
当您准备好开始您的项目时,您可以参考它。
选择一个网站
当您需要从 网站 获取信息,但 网站 不提供 API 或以编程方式获取信息的机制时,Scrapy 可以提供帮助。
以 Mininova 网站 为例,我们要获取今天添加的所有*敏*感*词*的 URL、名称、描述和文件大小信息。
今天添加的*敏*感*词*列表可以在此页面上找到:
定义要抓取的数据
第一步是定义我们需要抓取的数据。在 Scrapy 中,这是通过 . (在这种情况下是 torrent 文件)
我们定义的项目:
import scrapy
class TorrentItem(scrapy.Item):
url = scrapy.Field()
name = scrapy.Field()
description = scrapy.Field()
size = scrapy.Field()
编写一个提取数据的蜘蛛
第二步是写蜘蛛。它定义了初始 URL()、后续链接的规则以及从页面中提取数据的规则。
通过查看页面内容,所有*敏*感*词*都有相似的 URL。其中 NUMBER 是一个整数。根据这个规则,我们可以定义需要跟进的链接的正则表达式: /tor/\d+ 。
我们使用 XPath 选择要从页面的 HTML 源中提取的数据。以其中一个 torrent 文件的页面为例:
查看 HTML 页面源并为我们需要的数据(*敏*感*词*名称、描述和大小)创建一个 XPath 表达式。
通过观察,我们可以看到文件名收录在标签中:
Darwin - The Evolution Of An Exhibition
对应的 XPath 表达式:
//h1/text()
*敏*感*词*的描述收录在 id="description" 中
在标签中:
Description:
Short documentary made for Plymouth City Museum and Art Gallery regarding the setup of an exhibit about Charles Darwin in conjunction with the 200th anniversary of his birth.
...
对应XPath表达式获取描述:
//div[@id='description']
文件大小信息收录在 id=specifications 中
第二
在标签中:
Category:
Movies > Documentary
Total size:
150.62 megabyte
选择文件大小的 XPath 表达式:
//div[@id='specifications']/p[2]/text()[2]
有关 XPath 的更多信息,请参阅 XPath 参考。
最后,结合以上给出蜘蛛代码:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
class MininovaSpider(CrawlSpider):
name = 'mininova'
allowed_domains = ['mininova.org']
start_urls = ['http://www.mininova.org/today']
rules = [Rule(LinkExtractor(allow=['/tor/\d+']), 'parse_torrent')]
def parse_torrent(self, response):
torrent = TorrentItem()
torrent['url'] = response.url
torrent['name'] = response.xpath("//h1/text()").extract()
torrent['description'] = response.xpath("//div[@id='description']").extract()
torrent['size'] = response.xpath("//div[@id='specifications']/p[2]/text()[2]").extract()
return torrent
TorrentItem 在 .
执行爬虫获取数据
最后,我们可以运行爬虫获取网站的数据,并以JSON格式存储到scraped_data.json文件中:
scrapy crawl mininova -o scraped_data.json
在命令中用于导出 JSON 文件。您可以修改导出格式(XML 或 CSV)或存储后端(FTP 或 Amazon S3),这并不难。
同时,您也可以写入存储项目到数据库中。
查看提取的数据
执行后,当您查看 scraped_data.json 时,您将看到提取的项目:
[{"url": "http://www.mininova.org/tor/2676093", "name": ["Darwin - The Evolution Of An Exhibition"], "description": ["Short documentary made for Plymouth ..."], "size": ["150.62 megabyte"]},
# ... other items ...
]
由于返回的是一个列表,所以值是存储在一个列表中的(直接赋值的url除外)。如果您想保存单个数据或对数据执行其他处理,这就是发挥作用的地方。
还有什么?
您已经了解了如何使用 Scrapy 从网页中提取和存储信息,但这只是冰山一角。Scrapy 提供了许多强大的功能,使爬取更容易、更高效,例如:
为非英语语言中的非标准或不正确的编码声明提供自动检测和强大的编码支持。支持基于模板生成爬虫。在加快爬虫创建速度的同时,在更大的项目中保持代码的一致性。有关详细信息,请参阅命令。对于多个爬虫下的性能评估和故障检测,它提供了可扩展性。提供,为您测试XPath表达式、编写和调试爬虫、简化生产环境的部署和操作、监控机器提供了极大的便利。内置,
下一个
下一步当然是下载 Scrapy,你可以阅读它并加入社区。谢谢您的支持!
讨论