一 简介

  crawlspider 是Spider的一个子类,除了继承spider的功能特性外,还派生了自己更加强大的功能。

  LinkExtractors链接提取器,Rule规则解析器。

二 强大的链接提取器和规则解析器

1 LinkExtractor 链接提取器

    LinkExtractor(

         allow=r'Items/',# 满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。

         deny=xxx,  # 满足正则表达式的则不会被提取。

         restrict_xpaths=xxx, # 满足xpath表达式的值会被提取

         restrict_css=xxx, # 满足css表达式的值会被提取

         deny_domains=xxx, # 不会被提取的链接的domains。 

    )
作用:提取response中符合规则的链接

2 Rule:规则解析器

Rule(linkExtractor(allow=r'Items/'),callback='parse_item',follow=True)
-参数介绍
  参数1:制定链接提取器
  参数2:制定规则解析器解析数据的规则(回调函数)
  参数3:是否允许链接提取器继续作用到已经提取到的链接网页上提取新的链接,
     默认是True,即继续提取。

3 rules=()

制定不同的规则的解析器。一个Rule,一种提取规则。

三 CrawlSpider整体流程

  1. 爬取文件首先根据起始url,获取改url的网页内容;
  2. 链接提取器会根据指定提取规则将步骤1中网页内容中的链接进行提取;
  3. 规则解析器回根据指定解析规则将链接中的网页内容根据制定规则进行解析;
  4. 将解析数据封装到item中,然后提交给管道进行持久化存储。

四 实战抽屉全站爬取

  • 1 创建项目
scrapy start project ChouTi
  • 2 创建爬虫文件
cd Chouti

scrapy genspider -t crawl choti chouti.com
  • 3 爬虫文件 chouti.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ChouTi.items import ChoutiItem
#LinkExtractor:链接提取器
#Rule:规则解析器 class ChoutiSpider(CrawlSpider):
name = 'chouti'
# allowed_domains = ['xxx.com']
start_urls = ['https://dig.chouti.com/r/scoff/hot/1'] link=LinkExtractor(allow=r'/r/scoff/hot/\d+')
rules = (
Rule(link, callback='parse_item', follow=True),
) def parse_item(self, response):
# print(response)
div_list=response.xpath('//div[@id="content-list"]/div')
for div in div_list:
content=div.xpath('.//div[@class="news-content"]/div[1]/a[1]/text()').extract_first().strip()
author=div.xpath('.//div[@class="part2"]/a[4]//text()').extract_first()
author="".join(author)
item=ChoutiItem()
item['author']=author
item['content']=content
yield item
注意:

多链接解析器书写方式;

class ChoutiSpider(CrawlSpider):
name = 'chouti'
# allowed_domains = ['xxx.com']
start_urls = ['https://dig.chouti.com/r/scoff/hot/1'] link=LinkExtractor(allow=r'/r/scoff/hot/\d+')
link2=LinkExtractor(allow='^/text/$') #增加特定页面提取规则
rules = (
Rule(link, callback='parse_item', follow=True),
Rule(link2, callback='parse_item', follow=True),#允许添加多个规则
)

4 items.py

import scrapy

class ChoutiItem(scrapy.Item):
# define the fields for your item here like:
content = scrapy.Field()
author = scrapy.Field()

5 pipelines.py

import pymongo

class ChoutiPipeline(object):
conn=None def open_spider(self,spider):
self.conn=pymongo.MongoClient(host='127.0.0.1',port=27017)
def process_item(self, item, spider):
# print(item)
self.conn.spider.chouti.insert(item.__dict__)
return item

6 settings.py

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'

ROBOTSTXT_OBEY = False

ITEM_PIPELINES = {
'ChouTi.pipelines.ChoutiPipeline': 300,
}

爬虫系列---scrapy全栈数据爬取框架(Crawlspider)的更多相关文章

  1. 基于CrawlSpider全栈数据爬取

    CrawlSpider就是爬虫类Spider的一个子类 使用流程 创建一个基于CrawlSpider的一个爬虫文件 :scrapy genspider -t crawl spider_name www ...

  2. 爬虫系列4:Requests+Xpath 爬取动态数据

    爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...

  3. scrapy爬虫系列之二--翻页爬取及日志的基本用法

    功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...

  4. Java爬虫系列四:使用selenium-java爬取js异步请求的数据

    在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何用jsoup分析html源文件内容得到我们想要的数据,但是有时候通过这两种方式不能正常抓取到我们想要的数据,比如看如下例子. ...

  5. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

    爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...

  6. 爬虫系列3:Requests+Xpath 爬取租房网站信息并保存本地

    数据保存本地 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 爬虫系列2:https://www ...

  7. 爬虫系列(1)-----python爬取猫眼电影top100榜

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...

  8. 爬虫系列2:Requests+Xpath 爬取租房网站信息

    Requests+Xpath 爬取租房网站信息 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 ...

  9. Python进行拉勾网数据爬取框架与思路

    爬取内容 用交互式的方式输入想查询的职位并循环输出职位简要信息,为了方便阅读,本文使用到的变量并不是以目标变量的英文来命名,而是为了方便而取的变量名,各位大牛请谅解.(因贵网站爬取一定量数据后需要登陆 ...

随机推荐

  1. Vue API(directives) 自定义指令

    前言:除了vue的内置指令以外,我们可以定义自定义指令.内置指令表相见:https://www.cnblogs.com/ilovexiaoming/p/6840383.html 我们定义一个最简单的 ...

  2. qt 窗口鼠标穿透

    Qt 不规则窗体 – 鼠标点击穿透 qt实现鼠标穿透,如果要被穿透窗口只有一层,也即没有嵌套窗口,直接只用对子窗口使用setAttribute (Qt::WA_TransparentForMouseE ...

  3. 简单上手nodejs调用c++(c++和js的混合编程)

    因为项目的原因,最近经常使用node.js搭RESTful接口. 性能还是很不错啦,感觉比Spring Boot之类的要快.而且在不错的性能之外,只要程序结构组织好,别让太多的回调把程序结构搞乱,整体 ...

  4. Lucene 02 - Lucene的入门程序(Java API的简单使用)

    目录 1 准备环境 2 准备数据 3 创建工程 3.1 创建Maven Project(打包方式选jar即可) 3.2 配置pom.xml, 导入依赖 4 编写基础代码 4.1 编写图书POJO 4. ...

  5. windows下使用jenkins持续集成.net项目

    前言 随着微服务的兴起,原先一个庞大的项目,被切分一个个功能独立的微服务,虽然使得业务系统的扩展性和维护性得到提升,但是也加大了维护人员的工作量.有的系统由成百上千个微服务组成,如果每次有修改,都要手 ...

  6. 【ASP.NET Core快速入门】(十六)MVC开发:DbContextSeed初始化

    前言 由于我们现在每次EF实体模型变化的时候每次都是手动更改,我们想通过代码的方式让他自动更新,或者程序启动的时候添加一些数据进去 DbContextSeed初始化 首先,在Data文件夹下添加一个A ...

  7. springboot+mybatis+dubbo+aop日志第一篇

    本篇文章主要讲述项目搭建过程,不会涉及过多的基础知识,本项目是作者对前段时间学习的一个总结,主要使用到技术有:maven父子工程.springboot.mybatis.dubbo.zookeeper. ...

  8. Android单个控件占父控件宽度一半且水平居中

    前些天,在工作中遇到了一个需求:一个“加载上一页”的按钮宽度为父控件宽度一半,且水平居中于父控件中. 在此给出两种思路: 1.直接在Activity代码中获取到当前父控件的宽度,并将此按钮宽度值设置成 ...

  9. Jenkins结合.net平台综合之监听git仓库并自动摘取最新代码编译

    前面章节我们讲解了Jenkins结合.net平台工具以及一些第三方工具实现项目自动还原,自动编译,自动测试和自动发布.然而实现自动化还有一个关键的步骤就是监听源码仓库变化然后从仓库拉取最新代码,然后再 ...

  10. 经典JS的HTML转义与反转义字符

    //HTML转义 function HTMLEncode(html) { var temp = document.createElement ("div"); (temp.text ...