scrapy分页抓取网页(初窥ScrapyScrapy背后的概念与工作原理(一))
优采云 发布时间: 2021-12-13 10:29scrapy分页抓取网页(初窥ScrapyScrapy背后的概念与工作原理(一))
先看Scrapy
Scrapy 是一个应用框架,用于抓取 网站 数据并提取结构化数据。它可用于包括数据挖掘、信息处理或存储历史数据在内的一系列程序中。
它最初是为页面抓取(更准确地说,网络抓取)而设计的,也可用于检索 API(例如 Amazon Associates Web Services)或一般网络爬虫返回的数据。
本文档将介绍 Scrapy 背后的概念,让您了解其工作原理,并确定 Scrapy 是否是您所需要的。
当你准备好开始你的项目时,你可以参考它。
选择一个网站
当你需要从某个网站获取信息,但是网站没有提供API或者通过程序获取信息的机制,Scrapy可以帮到你。
以 Mininova 网站 为例,我们要获取今天添加的所有*敏*感*词*的 URL、名称、描述和文件大小信息。
可以在此页面上找到今天添加的*敏*感*词*列表:
定义要爬取的数据
第一步是定义我们需要爬取的数据。在 Scrapy 中,这是通过的。(在这个例子中,它是*敏*感*词*文件)
我们定义的Item:
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 源代码中选择要提取的数据。以其中一个*敏*感*词*文件的页面为例:
观察 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 参考。
最后结合上面的内容给出spider的代码:
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 的定义在。
执行spider获取数据
最后,我们可以运行spider获取网站的数据,并以JSON格式保存在scraped_data.json文件中:
scrapy crawl mininova -o scraped_data.json
在命令中用于导出 JSON 文件。您可以修改导出格式(XML 或 CSV)或存储后端(FTP 或 Amazon S3),这并不难。
同时,您还可以将项目写入并存储在数据库中。
查看提取的数据
执行后,查看scraped_data.json,会看到解压出来的item:
[{"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 进程中钩入 Python 终端,可以查看和调试爬虫。方便您在抓取过程中捕捉错误。支持站点地图。使用缓存抓取 DNS 解析器
下一个
下一步当然是下载Scrapy,你可以阅读它并加入社区。谢谢您的支持!
讨论