scrapy分页抓取网页(这篇教程比Scrapy官方教程构建网页爬虫的内部工作机制)

优采云 发布时间: 2022-04-06 23:22

  scrapy分页抓取网页(这篇教程比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"):

  # 添加协议名称

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线