目录

CrawlSpider简介

rules

parse_start_url(response)

Rule(爬取规则)

Link Extractors

CrawlSpider实战

创建项目

定义Item

创建CrawlSpider

编写Pipeline

启动爬虫


CrawlSpider简介

class scrapy.spiders.CrawlSpider

CrawlSpider 是 Spider 的一个子类,不仅天生就继承了Spider的所有特性,还在Spider的基础上提供了一些扩展能力:允许用户定义一些规则(Rule)来跟进那些需要继续爬取的URL(链接)。

除了从Spider继承过来的属性外,CrawlSpider 还提供了一个新的属性:

rules

一个包含一个(或多个) Rule 对象的集合(list)。 每个 Rule 对爬取网站的一类URL链接定义了特定表现。 如果多个Rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。

CrawlSpider 也提供了一个可复写(overrideable)的方法:

parse_start_url(response)

当start_url的请求返回时,该方法被调用。 该方法分析最初的返回值并必须返回一个 Item 对象或者 一个 Request 对象或者 一个可迭代的包含二者对象。

Rule(爬取规则)

class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

scrapy.spiders.Rule各项参数:

  • link_extractor 是一个 Link Extractor 对象,用于定义需要提取的链接。
  • callback 是一个callable 或 string ( 该spider 中同名的函数将作为回调函数被调用)。 从link_extractor中每获取到匹配的链接时将会调用该函数。该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。
  • cb_kwargs 包含传递给回调函数的参数(keyword argument)的字典。
  • follow 是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果 callback 为 None, follow 默认设置为 True ,否则默认为 False 。
  • process_links 是一个callable或string(该spider 中同名的函数将作为回调函数被调用)。 从link_extractor 中获取到链接列表时将会调用该函数。该方法主要用来过滤。
  • process_request 是一个callable或string(该spider 中同名的函数将作为回调函数被调用)。 该规则提取到每个request时都会调用该函数。该函数必须返回一个request或者None。 (用来过滤request)

警告:当编写爬虫规则时,请避免使用 parse 作为回调函数。 由于 CrawlSpider 使用 parse 方法来实现其逻辑,如果 您覆盖了 parse 方法,crawl spider 将会运行失败。

Link Extractors

class scrapy.linkextractors.LinkExtractor

Link Extractors 用来从网页(scrapy.http.Response 对象)中抽取最终将会被follow 的链接。

Link Extractors常用参数:

  • allow 满足括号中“正则表达式”的URL会被提取,如果为空,则全部匹配
  • deny 满足括号中“正则表达式”的URL一定不提取(优先级高于 allow )
  • allow_domains 会被提取的链接的 domains
  • deny_domains 一定不会被提取链接的domains
  • restrict_xpaths 使用 xpath表达式,和 allow 共同作用过滤链接,即 xpath 满足范围内的 URL 会被提取

Scrapy提供了 scrapy.linkextractors import LinkExtractor , 但你可以通过实现一个简单的接口创建自己定制的Link Extractor来满足需求。

每个link extractor有唯一的公共方法是 extract_links ,它接收一个 Response 对象,并返回一个 scrapy.link.Link 对象。Link Extractors,要实例化一次并且 extract_links 方法会根据不同的response调用多次提取链接。

CrawlSpider实战

本文将以爬取起点中文网中所有的免费文章(标题、简介、作者、文章地址)为例对CrawlSpider的用法进行示例。

创建项目

打开一个 Windows命令行窗口,切换到你打算存储代码的目录中(本例中是 D:\scrapy),运行下列命令:

d:\scrapy>scrapy startproject qidian_crawl

执行完该命令后,将会创建包含下列内容的 qidian_crawl 目录:

定义Item

在 items.py 中定义所需爬取的文章字段(标题、简介、作者、文章地址)。

import scrapyclass QidianCrawlItem(scrapy.Item):title = scrapy.Field() # 标题intro = scrapy.Field() # 简介author = scrapy.Field() # 作者url = scrapy.Field() # 文章地址

创建CrawlSpider

CrawlSpider 的创建方法跟普通的Spider类似,在Windows命令行执行如下命令完成创建:

d:\scrapy>cd qidian_crawl
d:\scrapy\qidian_crawl>scrapy genspider -t crawl qidian qidian.com

执行完该命令后,将会在 qidian_crawl 的 spiders 目录下生成一个 qidian.py 文件 :

我们要在 qidian.py 文件中编写爬取网站的链接URL提取和处理规则。

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from qidian_crawl.items import QidianCrawlItemclass QidianSpider(CrawlSpider):  # 继承自 class CrawlSpider(Spider)name = 'qidian'  # 爬虫名称,启动爬虫时使用:scrapy crawl <爬虫名称>allowed_domains = ['qidian.com']  # 允许爬取的范围'''爬虫的起始地址,其响应可使用 parse_start_url(response) 进行专门处理。'''start_urls = ['https://www.qidian.com/free/all?orderId=&vip=hidden&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=1&page=1']def start_requests(self):  # 启动时设置 Cookies ,Spider 的特性cookies = 'e1=%7B%22pid%22%3A%22qd_P_xiangqing%22%2C%22eid%22%3A%22%22%7D; e2=%7B%22pid%22%3A%22qd_P_xiangqing%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A4%7D; _csrfToken=0oIxR8Di1jdqyiUCGJAhBLcm6a0kyMuvmrq0vyjI; newstatisticUUID=1556264399_358226677; e2=%7B%22pid%22%3A%22qd_P_free%22%2C%22eid%22%3A%22qd_C44%22%7D; e1=%7B%22pid%22%3A%22qd_P_limitfree%22%2C%22eid%22%3A%22qd_E01%22%2C%22l1%22%3A4%7D'cookies = {i.split('=')[0]: i.split('=')[1] for i in cookies.split('; ')}yield scrapy.Request(self.start_urls[0], cookies=cookies)'''链接URL的提取和处理规则'''rules = (Rule(LinkExtractor(allow=r'//book.qidian.com/info/\d+'), callback='parse_item', follow=False),Rule(LinkExtractor(allow=r'//www\.qidian\.com/free/all\?orderId=&vip=hidden&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=1&page=\d+'),follow=True),)def parse_item(self, response):  # 回调函数item = QidianCrawlItem()item['url'] = response.request._urlitem['title'] = response.xpath("//div[@class='book-info ']/h1/em/text()").extract_first()item['author'] = response.xpath("//div[@class='book-info ']/h1/span/a/text()").extract_first()item['intro'] = response.xpath("//div[@class='book-info ']//p[@class='intro']/text()").extract_first()yield item

编写Pipeline

CrawlSpider中收集的Item将会被传递到Item Pipeline中再次进行处理,在这里我们将提取到的QidianCrawlItem数据保存到文件中。

# -*- coding: utf-8 -*-from qidian_crawl.items import QidianCrawlItem
import jsonclass QidianCrawlPipeline(object):def process_item(self, item, spider):if isinstance(item, QidianCrawlItem):  # 仅处理 QidianCrawlItem ,其他Item不予处理,直接返回# 将文章数据保存到文件with open('qidian.txt', 'a', encoding='utf-8') as f:json.dump(dict(item), f, ensure_ascii=False, indent=2)return item

在settings.py 中激活 Pipeline,并设置好 User-Agent 。

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'qidian_crawl.pipelines.QidianCrawlPipeline': 300,
}# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'# Obey robots.txt rules
ROBOTSTXT_OBEY = False

启动爬虫

至此示例项目就算配置完成了,在Windows命令行执行如下命令来启动爬虫:

d:\scrapy\qidian_crawl>scrapy crawl qidian

待程序执行完成后,会在Scrapy项目的根目录下生成一个qidian.txt文本文件。

qidian.txt 中的前两条帖子内容如下:

Scrapy--CrawlSpider相关推荐

  1. scrapy crawlspider

    crawlspider就可以实现上述需求,能够匹配满足条件的url地址,组装成Reuqest对象后自动发送给引擎,同时能够指定callback函数 1.从response中提取所有的满足规则的url地 ...

  2. Scrapy CrawlSpider介绍和使用

    一.介绍CrawlSpider   CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著的功能就是" ...

  3. scrapy+crawlspider+增量式爬取电影

    如果我们要爬去一个网站,而网站的数据又是经常更新的,但是对于爬虫来说,启动爬虫的时候他会认为他爬取的数据是新的,因此,我们需要一个凭证来告诉爬虫这个数据已经存在 movie.py # -*- codi ...

  4. 爬取汽车之家图片 - scrapy - crawlspider - python爬虫案例

    爬取汽车之家图片 需求:爬取汽车之家某一个汽车的图片 ​ 一. 普通scrapy 第一步 页面分析 目标url: https://car.autohome.com.cn/photolist/serie ...

  5. 爬虫教程( 2 ) --- 爬虫框架 Scrapy、Scrapy 实战

    From:https://piaosanlang.gitbooks.io/spiders/content/ scrapy-cookbook :https://scrapy-cookbook.readt ...

  6. 爬虫 第六讲 Scrapy框架

    文章目录 爬虫 第六讲 Scrapy框架 一.Scrapy框架 Scrapy简介 工作流程 Scrapy入门 pipline使用 1.scrapy.Request知识点 2.item的介绍和使用 3. ...

  7. Scrapy框架 - 学习日记2

    1.调试 1.1 loggin模块的使⽤ import scrapy import logginglogger = logging.getLogger(__name__)class QbSpider( ...

  8. Scrapy爬虫爬取电影天堂

    Scrapy CrawlSpider爬取 目标网址:http://www.dytt8.net 创建项目:scrapy startproject <爬虫项目文件的名字> 生成 CrawlSp ...

  9. 逆向爬虫18 Scrapy抓取全站数据和Redis入门

    逆向爬虫18 Scrapy抓取全站数据和Redis入门 一.全站数据抓取 1. 什么是抓取全站数据? 我们曾经在过猪八戒,图片之家,BOSS直聘等网站,利用网站官方提供的搜索功能,搜索指定关键词的内容 ...

  10. Python+Pycharm +Scrapy搭建爬虫项目

    Python+Pycharm +Scrapy搭建爬虫项目 Scrapy简介: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系 ...

最新文章

  1. python 数据分析学什么-如何学习Python数据分析呢?老男孩Python培训
  2. python区块链开发_Fabric区块链Python开发详解
  3. hdu5438(2015长春网络赛B题)
  4. docker add-host hostAliases配置/etc/hosts
  5. 关于mysql的wait_timeout参数 设置不生效的问题
  6. Spring和JSF集成:选择项目
  7. 数字信号处理6:IIR滤波器设计
  8. python dataframe行数_python – 如何在DataFrame中增加groupby中的行数
  9. Theos(二):NIC(New Instance Creator)
  10. TcaplusDBx 黎明觉醒|一路相伴,不负期待
  11. 关闭、清除IBM小型机橙色告警灯方法
  12. 【Android 2D 游戏开发(5)】——九宫格拼图(苍老师版)
  13. Unity-业余2D游戏制作笔记02-Dialogue System for Unity使用
  14. [离散数学]命题逻辑P_7:范式
  15. 易經大意(1) 三和 韓長庚 著24
  16. 【遇见大咖】测试界:如何定位自己的角色扮演?
  17. Java中的数值计算
  18. 看懂了再说自己是程序员哈哈
  19. 如何制作一张圣诞贺卡二维码?
  20. python基础知识整理

热门文章

  1. 报错: Called “net usershare info“ but it failed
  2. gdiplus::real_编程的第二个十年:关于Real™编程器的全部
  3. SQL server一丢丢杂乱的整理
  4. vue模仿网易云客户端
  5. Android - 集成高德地图API(搜索,地图,定位)
  6. Windows 系统托盘图标
  7. [Excel函数] AVERAGE函数 | AVERAGEIF函数 | AVERAGEIFS函数
  8. 快看!!!北极点的气温在零度以上!比平常高了30度!!!!!!
  9. 为什么火狐浏览器打开默认是hao123
  10. java around_关于Aop切面中的@Before @Around等操作顺序的说明