scrapy分页抓取网页(这篇教程比Scrapy官方教程构建网页爬虫的内部工作机制)
优采云 发布时间: 2022-04-06 23:22scrapy分页抓取网页(这篇教程比Scrapy官方教程构建网页爬虫的内部工作机制)
当我刚开始在这个行业工作时,我首先意识到的一件事是,有时您需要自己采集、组织和清理数据。在本教程中,我们将从众筹的 网站FundRazr 采集数据。和很多网站一样,这个网站有自己的结构、形式和大量有用的数据,但是它没有结构化的API,所以获取数据并不容易。在本教程中,我们将抓取 网站 数据并将其组织成有序的形式来创建我们自己的数据集。
我们将使用 Scrapy,一个用于构建网络爬虫的框架。Scrapy 可以帮助我们创建和维护网络爬虫。它使我们能够专注于使用 CSS 选择器和 XPath 表达式提取数据,而不是关注爬虫的内部工作。本教程比官方的 Scrapy 教程更深入一些。希望大家看完本教程后,在需要抓取数据有一定难度的时候,也能自己完成。好吧,让我们开始吧。
准备
如果您已经安装了 anaconda 和 google chrome(或 firefox),则可以跳过此部分。
安装蟒蛇。可以从官网下载anaconda自行安装,也可以参考我之前写的anaconda安装教程(Mac、Windows、Ubuntu、环境管理)。
安装 Scrapy。其实Anaconda已经自带了Scrapy,但是如果遇到问题,也可以自己安装:
conda install -c conda-forge scrapy
确保您安装了 chrome 或 firefox。在本教程中,我将使用 chrome。
创建新的 Scrapy 项目
可以使用 startproject 命令创建一个新项目:
此命令将创建一个 fundrazr 目录:
基金/
scrapy.cfg # 部署配置文件
fundrazr/ # 项目的 Python 模块
__init__.py
items.py # 物品物品定义
pipelines.py # 项目管道文件
settings.py # 项目设置文件
spiders/ # 蜘蛛目录
__init__.py
scrapy startprojectfundrazr
使用 chrome(或 firefox)的开发者工具查找初始 url
在爬虫框架中,start_urls是爬虫开始爬取的url列表。我们将为 start_urls 列表中的每个元素获得一个指向单个项目页面的链接。
下图显示初始 url 因所选类别而异。黑框高亮部分是要抓取的类别。
在本教程中,start_urls 列表中的第一项是:
接下来,我们将看到如何访问下一页并将相应的 url 添加到 start_urls 中。
第二个网址是:
下面是创建 start_urls 列表的代码。其中,npages 指定要翻的页数。
start_urls = [“”]
npages = 2
对于范围内的 i (2, npages + 2 ):
start_urls.append(";page="+str(i)+"")
使用 Srapy shell 查找单个项目页面
使用 Scrapy shell 是学习如何基于 Scrapy 提取数据的最佳方式。我们将使用 XPaths,它可用于选择 HTML 文档中的元素。
我们首先需要尝试获取单个项目页面链接的 XPath。我们将使用浏览器的检查元素。
我们将使用 XPath 提取下图中红色框内的部分。
我们首先启动 Scrapy shell:
刮痧壳 '#39;
在 Scrapy shell 中输入以下代码:
response.xpath("//h2[contains(@class, 'title header-font')]/a[contains(@class, 'campaign-link')]//@href").extract()
使用 exit() 退出 Scrapy shell。
单品页面
之前我们介绍了如何提取单个项目页面链接。现在我们将介绍如何在单个项目页面上提取信息。
首先我们进入将被抓取的单品页面(链接如下)。
使用上一节中提到的方法,检查页面的标题。
现在我们将再次使用 Scrapy shell,只是这次来自单个项目页面。
刮壳“手臂”
提取标题的代码是:
response.xpath("//div[contains(@id, 'campaign-title')]/descendant::text()").extract()[0]
页面的其他部分也是如此:
# 筹款总额
response.xpath("//span[contains(@class,'stat')]/span[contains(@class, 'amount-raised')]/descendant::text()").extract()
#筹款目标
response.xpath("//div[contains(@class, 'stats-primary with-goal')]//span[contains(@class, 'stats-label hidden-phone')]/text()"). 提炼()
# 货币
response.xpath("//div[contains(@class, 'stats-primary with-goal')]/@title").extract()
# 最后期限
response.xpath("//div[contains(@id, 'campaign-stats')]//span[contains(@class,'stats-label hidden-phone')]/span[@class='nowrap'] /text()").extract()
# 参与
response.xpath("//div[contains(@class, 'stats-secondary with-goal')]//span[contains(@class, 'donation-count stat')]/text()").extract( )
# 故事
response.xpath("//div[contains(@id, 'full-story')]/descendant::text()").extract()
# 网址
response.xpath("//meta[@property='og:url']/@content").extract()
项目
网页抓取的主要目标是从非结构化来源中提取结构化信息。Scrapy 爬虫以 Python 字典的形式返回提取的数据。Python 字典虽然方便熟悉,但仍然不是很结构化:字段名容易出现拼写错误,返回的信息不一致,尤其是在有多个爬虫的大型项目中。因此,我们定义 Item 类来存储数据(在输出数据之前)。
导入scrapy
classFundrazrItem(scrapy.Item):
活动标题 = scrapy.Field()
amountRaised = scrapy.Field()
目标 = scrapy.Field()
货币类型 = scrapy.Field()
endDate = scrapy.Field()
numberContributors = scrapy.Field()
故事 = scrapy.Field()
url = scrapy.Field()
将其保存在 fundrazr/fundrazr 目录中(覆盖原来的 items.py 文件)。
爬虫
我们定义了一个爬虫类,供 Scrapy 用来抓取 网站(或一组 网站)信息。
# 继承scrapy.Spider类
classFundrazr(scrapy.Spider):
# 指定爬虫名称,运行爬虫时需要
名称 = “我的刮刀”
# 定义 start_urls, npages
# 具体定义见上文
def 解析(自我,响应):
for href in response.xpath("//h2[contains(@class, 'title header-font')]/a[contains(@class, 'campaign-link')]//@href"):
# 添加协议名称