scrapy分页抓取网页(初窥ScrapyScrapy背后的概念与工作原理(一))
优采云 发布时间: 2021-10-08 19:10scrapy分页抓取网页(初窥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()
编写一个提取数据的蜘蛛
第二步是写一个spider。它定义了初始 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 参考。
最后结合上面的内容给出蜘蛛的代码:
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='info-left']/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终端,可以为你查看和调试爬虫爬虫过程中的Catching errors为Sitemaps爬取带有缓存的DNS解析器提供方便的支持
下一个
下一步当然是下载Scrapy,你可以阅读它并加入社区。感谢您的支持!
讨论