# -*- coding: utf-8 -*-
import scrapy,re
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from crawlspider.items import CrawlspiderItem class CrawlspidersSpider(CrawlSpider):
name = 'CrawlSpiders'
allowed_domains = ['sbiquge.com']
start_urls = ['https://www.sbiquge.com/biqukan/'] rules = (
Rule(LinkExtractor(allow="/\d+?_\d+?/",unique=True),callback='parse_item',follow=False),
# 注意使用restricted_xpath提取链接的时候只能到标签就好了,千万不要到具体的标签属性,那叫画蛇添足。
# 这个rule实例有callback属性,那么它就是从所有下载到的response里面提取链接,并下载链接内容由回调函数处理数据
)
def parse_item(self, response): chap_list = response.xpath('.//*[@class="listmain"]/dl/dd')
for chapter in chap_list:
novel_name = chapter.xpath('//*[@id="book"]/div[1]/div/a[2]/text()').extract_first()
chapter_name = chapter.xpath('./a/text()').extract_first()
chapter_link = chapter.xpath('./a/@href').extract_first()
if chapter_name:
item = CrawlspiderItem(chapter_title=chapter_name,novel_name=novel_name)
url = response.urljoin(chapter_link)
request = scrapy.Request(url=url,callback=self.parse_body)
request.meta['key'] = item
yield request def parse_body(self,response):
item = response.meta['key']
content_list = response.xpath('.//*[@id="content"]').re('([\u4e00-\u9fa5]|<br>)+?') # 匹配到的是一个列表
# 利用re直接匹配小说的汉字内容.正则可以匹配标签下的任何内容,这样我们可以提取我们想要的数据
content_str = ''.join(content_list)
content = re.sub('<br><br>','\n ',content_str)
# 对匹配的章节进行分段
item['content'] = content
yield item

  

重点在于CrawlSpider的学习!!!!!!!!!!!!!

**通过前面的学习我们可以进行一些页面的简单自动话爬取,对于一些比较规则的网站,我们似乎可以用Spider类去应付,可是,对于一些较为复杂或者说链接的存放不规则的网站我们该怎么去爬取呢,接下来的爬虫就是要解决这个问题,而且还可以高度的自动化爬取链接和链接内容**
1
CrawlSpider类,是建立爬虫的另外一个类。

*(顺便说一下,我们可以继承四种类来建立我们的scrapy爬虫,他们是:Spider类,CrawlSpider类, CSVFeedSpider类和XMLFeedSpider类,今天我们讲的就是CrawlSpider类建立的爬虫)*
1
CrawlSpider类通过一些规则(rules),使对于链接(网页)的爬取更具有通用性,换句话说,CrawlSpider爬虫为通用性的爬虫,而Spider爬虫更像是为一些特殊网站制定的爬虫。

那我们开始正式的讲解一下CrawlSpider爬虫。。。。

首先我们建立一个爬虫工程:

scrapy startproject crawlspider
1
这个我们很熟悉,接下来创建一个CrawlSpider爬虫

scrapy genspider -t crawl Crawlspider domain.com
1
注意上面,我们比Spider爬虫建立时多了一个’-t crawl’,这是值爬虫的类
这样以后我们就可以在我们的spiders文件中找到这个爬虫

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class CrawlspiderSpider(CrawlSpider):
name = 'crawlspider'
allowed_domains = ['domain.com']
start_urls = ['http://domain.com/']

rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)

def parse_item(self, response):
i = {}
#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#i['name'] = response.xpath('//div[@id="name"]').extract()
#i['description'] = response.xpath('//div[@id="description"]').extract()
return i

上面是打开爬虫后,自动生成的一段代码,这段代码可以说基本上对于CrawlSpider爬虫的结构有一个构造,我们看到,有一个rules属性,还有这个爬虫继承的类是CrawlSpider,这两点就是与前几篇讲的Spider爬虫的区别。其中rules属性使这个爬虫的核心

所以我们在开始讲我们的实战项目之前我们应该先讲一下这个rules属性。
rules属性由几个Rule对象构成,而Rule对象定义了提取链接等操作的规则

那么Rule的构造又是怎样的呢?
Rule对象有六个属性,他们分别是:

LinkExtractor(…),用于提取response中的链接
callback=‘str’,回调函数,对提取的链接使用,用于提取数据填充item
cb_kwargs,传递给回调函数的参数字典
follow=True/False,对提取的链接是否需要跟进
process_links,一个过滤链接的函数
process_request,一个过滤链接Request的函数
上面的参数除了LinkExtractor外其它都是可选的,且当callback参数为None时,我们称这个rule为一个‘跳板’,也就是只下载页面,并不进行任何行为,通常作翻页功能
我们需要解释主要是LinkExtractor参数和follow参数:

一、LinkExtractor参数,明显是用来提取链接的。那么他是怎么来定义提取链接的规则的呢?它有十个参数,用来定义提取链接的规则,分别是:
1. allow=‘re_str’:正则表达式字符串,提取response中符合re表达式的链接。
2. deny=‘re_str’:排除正则表达式匹配的链接
3. restrict_xpaths=‘xpath_str’:提取满足xpath表达式的链接
4. restrict_css=‘css_str’:提取满足css表达式的链接
5. allow_domains=‘domain_str’:允许的域名
6. deny_domains=‘domain_str’:排除的域名
7. tags=‘tag’/[‘tag1’,’tag2’,…]:提取指定标签下的链接,默认会从a和area标签下提取链接
8. attrs=[‘href’,’src’,…]:提取满足属性的链接
9. unique=True/False:链接是否去重
10.process_value:值处理函数,优先级要大于allow
以上的参数可以一起使用,以提取同时满足条件的链接

二、follow参数:
为Boolean值,用于是否跟进链接的处理,在callback为None时,默认是跟进链接的,值为True;当callback不为空时,默认是False的,不跟进链接。当然我们可以根据需要赋值,

那么,什么叫跟进,什么叫不跟进呢?
就是你前面定义的规则对于已经提取到的链接的页面是不是在进行一次提取链接。
1
2
好!那么rules到底是怎么工作的呢?
这样的,对于Rule提取的链接会自动调用parse函数,并返回该链接的response,然后将这个response给callback回调函数,通过回调函数的解析对item进行填充

对了,CrawlSpider爬虫还有一个parse_start_url()方法,用于解析start_urls中的链接页面,这个方法一般用于有跳板的爬虫中,用于对首页的解析

说了那么多,我们来说说我们的爬虫项目。用CrawlSpider爬虫,爬取整站的小说

scrapy进阶(CrawlSpider爬虫__爬取整站小说)的更多相关文章

  1. Web侦察工具HTTrack (爬取整站)

    Web侦察工具HTTrack (爬取整站) HTTrack介绍 爬取整站的网页,用于离线浏览,减少与目标系统交互,HTTrack是一个免费的(GPL,自由软件)和易于使用的离线浏览器工具.它允许您从I ...

  2. Scrapy 框架 CrawlSpider 全站数据爬取

    CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...

  3. 爬虫之爬取B站视频及破解知乎登录方法(进阶)

    今日内容概要 爬虫思路之破解知乎登录 爬虫思路之破解红薯网小说 爬取b站视频 Xpath选择器 MongoDB数据库 爬取b站视频 """ 爬取大的视频网站资源的时候,一 ...

  4. 如何用python爬虫从爬取一章小说到爬取全站小说

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  5. python框架Scrapy中crawlSpider的使用——爬取内容写进MySQL

    一.先在MySQL中创建test数据库,和相应的site数据表 二.创建Scrapy工程 #scrapy startproject 工程名 scrapy startproject demo4 三.进入 ...

  6. 使用wget命令爬取整站

    快速上手(整个bootstrap网页全被你抓取下来了~_~) wget -c -r -npH -k -nv http://www.baidu.com 参数说明 -c:断点续传 -r:递归下载 -np: ...

  7. Python爬虫一爬取B站小视频源码

    如果要爬取多页的话 在最下方循环中 填写好循环的次数就可以了 项目源码 from fake_useragent import UserAgent import requests import time ...

  8. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  9. scrapy框架之CrawlSpider全站自动爬取

    全站数据爬取的方式 1.通过递归的方式进行深度和广度爬取全站数据,可参考相关博文(全站图片爬取),手动借助scrapy.Request模块发起请求. 2.对于一定规则网站的全站数据爬取,可以使用Cra ...

随机推荐

  1. [css]table的拆分

    https://blog.csdn.net/qq_35415600/article/details/70237433 <body> <table border="1&quo ...

  2. (转)Mysql LIMIT如何正确对其进行优化

    以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...

  3. python threading acquire release

    线程同步 //test.py import threading import time exitFlag = 0 class myThread (threading.Thread): def __in ...

  4. iOS 设计模式-Block实现代理的逻辑

    在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...

  5. Unity中HideInInspector和SerializeField以及Serializable

    首先,Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来. 然后是,什么样的值会被显示在面板上? 已经被序列 ...

  6. PyQT5速成教程-4 Qt Designer实战[上]

    本文由 沈庆阳 所有,转载请与作者取得联系! 前言 在前面几节的学习中,我们对PyQt的基本使用.Qt Designer与Python编码的工作流程有了基本的学习.同时也掌握了Qt Designer中 ...

  7. Ecshop 表结构 字段说明

    ecs_account_log 用户帐号情况记录表,包括资金和积分等 log_id mediumint 自增ID号user_id mediumint 用户登录后保存在session中的id号,跟use ...

  8. Mongodb $in $or 性能比较

      MongoDB docs have the answer: "When using $or with <expressions> that are equality chec ...

  9. Unity shader学习之逐顶点漫反射光照模型

    公式如下: Cdiffuse = Clight * mdiffuse * max(0, dot(n,l)); 其中,n 为表面法线,l 为指向光源的单位向量,mdiffuse 为材质温反射颜色,Cdi ...

  10. Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的问题

    Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的问题 今天闲来无事,准备搭一套SSM的环境,当然所有的jar包都用最新的. Mybatis使用3.4.6, ...