小爬爬7:回顾&&crawlSpider
1.回顾昨日内容
回顾
- 全站数据爬取(分页)
- 手动请求的发送Request(url,callback)
- post请求和cookie处理
- start_requests(self)
- FromRequest(url,callback,formdata)
- cookie操作是自动处理 - 请求传参
- 使用场景:
- 实现:scrapy.Request(url,callback,meta={'':''})
callback:response.meta['']
- 中间件
- 下载中间件:批量拦截所有的请求和响应
- 拦截请求:UA伪装(process_request),代理ip(process_exception:return request)
- 拦截响应:process_response
2.crawl总结
- CrawlSpider
作用:就是用于进行全站数据的爬取
- CrawlSpider就是Spider的一个子类
- 如何新建一个基于CrawlSpider的爬虫文件
- scrapy genspider -t crawl xxx www.xxx.com
- LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取
- Rule规则解析器:将链接提取器提取到的链接进行请求发送,然后对获取的页面数据进行
指定规则(callback)的解析
- 一个链接提取器对应唯一一个规则解析器
3.高效的全栈数据爬取
新建一个抽屉的项目,我们对其进行全栈数据的爬取
下图是页码对应的url
# -*- coding: utf- -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule class ChoutiSpider(CrawlSpider):
name = 'chouti'
# allowed_domains = ['www.xxx.com']
#抽屉的第一页链接
start_urls = ['https://dig.chouti.com/all/hot/recent/1']
#全栈数据爬取是将所有页码依次请求发送
#链接提取器:从起始url对应的页面中提取符合规则的链接,allow==>正则表达式
link=LinkExtractor(allow=r'/all/hot/recent/\d+')
rules = (
#规则解析器,可以有多个规则:将链接提取器提取到的链接对应的页面源码进行制定规则的解析
Rule(link, callback='parse_item', follow=False),
) def parse_item(self, response):
# item = {}
#item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
#item['name'] = response.xpath('//div[@id="name"]').get()
#item['description'] = response.xpath('//div[@id="description"]').get()
# return item
print(response)
修改下面的内容:
LOG_LEVEL='ERROR'
下面我们提取指定的规则执行下面的命令:
运行之后,我们只是爬取到了10条数据
我们需要将最后一个界面作为起始,也就是follow=True就可以了
再次运行下面的命令:
运行上边的命令,我们就成功取到120页的数据.
自己理解这句话:
follow:True将链接提取器继续作用到链接提取器链接对应的页面源码中,
新的需求:
4.crawlSpider深度爬取
案例:阳光热线,我们解析出首页的对应"标题"和详情页中的"段落"
2个链接提取器和2和规则解析器
(1)下面第一步,我们需要新建一个工程
添加UA和修改robot协议为false
注释allowed_domains,并且将起始url写在start_urls里边
阳光热线的第一页:http://wz.sun0769.com/index.php/question/report?page=
看一下,我们如何取到源码的链接:
我们看到的是页码中的数据是30的倍数,对比我们看到了这个发生了变化
修改follow=False,只爬取前五页,原因是数据量太大
我们需要拿到table的xpath解析,注意要修改tbody,再拿到下面的tr
执行程序
小爬爬7:回顾&&crawlSpider的更多相关文章
- ELK之开心小爬爬
1.开心小爬爬 在爬取之前需要先安装requests模块和BeautifulSoup这两个模块 ''' https://www.autohome.com.cn/all/ 爬取图片和链接 写入数据库里边 ...
- 小爬爬6.scrapy回顾和手动请求发送
1.数据结构回顾 #栈def push(self,item) def pop(self) #队列 def enqueue(self,item) def dequeue(self) #列表 def ad ...
- 小爬爬5:重点回顾&&移动端数据爬取1
1. ()什么是selenium - 基于浏览器自动化的一个模块 ()在爬虫中为什么使用selenium及其和爬虫之间的关联 - 可以便捷的获取动态加载的数据 - 实现模拟登陆 ()列举常见的sele ...
- java小知识点简单回顾
1.java的数据类型分为两种:简单类型和引用类型(数组.类以及接口).注意,java没有指针的说法,只有引用.简单类型的变量被声明时,存储空间也同时被分配:而引用类型声明变量(对象)时,仅仅为其分配 ...
- 小爬爬5:scrapy介绍3持久化存储
一.两种持久化存储的方式 1.基于终端指令的吃持久化存储: 特点:终端指令的持久化存储,只可以将parse方法的返回值存储到磁盘文件 因此我们需要将上一篇文章中的author和content作为返回值 ...
- 小爬爬4:12306自动登录&&pyppeteer基本使用
超级鹰(更简单的操作验证) - 超级鹰 - 注册:普通用户 - 登陆: - 创建一个软件(id) - 下载示例代码 1.12306自动登录 # Author: studybrother sun fro ...
- 小爬爬1:jupyter简单使用&&爬虫相关概念
1.jupyter的基本使用方式 两种模式:code和markdown (1)code模式可以直接编写py代码 (2)markdown可以直接进行样式的指定 (3)双击可以重新进行编辑 (4)快捷键总 ...
- 小爬爬5:scrapy介绍2
1.scrapy:爬虫框架 -框架:集成了很多功能且具有很强通用性的一个项目模板 -如何学习框架:(重点:知道有哪些模块,会用就行) -学习框架的功能模板的具体使用. 功能:(1)异步爬取(自带buf ...
- 小爬爬6: 网易新闻scrapy+selenium的爬取
1.https://news.163.com/ 国内国际,军事航空,无人机都是动态加载的,先不管其他我们最后再搞中间件 2. 我们可以查看到"国内"等板块的位置 新建一个项目,创建 ...
随机推荐
- 记一次msf入侵win10,并拍照
好久没有玩kali了,刚才看到一位大佬msf渗透win10的思路,我感觉不错,我就来复现一下 kali :192.168.45.136 win10 : 192.168.45.137 1 首先,我们查 ...
- Object上的静态方法
内置提供了一个对象为 Object ,也被称之为是构造函数,用来创建对象用的.在 javascript 函数也是对象,是一种可被执行的对象,所以称Object为对象也是可以的.挂在函数上的方法,称之为 ...
- webServices学习二(小试牛刀。jdk 方式发布一个应用)
一.前提 1.用Jdk1.6.0_21以后的版本发布一个WebService服务. 2.与Web服务相关的类,都位于javax.jws.*包中. 1.主要类有: 1.@WebService - 它是 ...
- 【python之路41】web框架
一.web框架介绍 一共有两种web框架 1.既包含socket又能逻辑处理 tornado框架 2.只能处理逻辑 Django bottle flask 二.web框架的本质 众所周知,对于所有的 ...
- HDU6187 Destroy Walls
把这道题放了很久才来更新blog,似乎越来越懒了啊. 我们发现他给的城堡的坐标非常有趣啊,都是无理数. 对于其他所有点的坐标都是有理数的情况下,一个坐标为无理数的点绝对特别. 特别之处就是:经 ...
- [BZOJ3990][SDOI2015][LOJ#2181]-排序
说实话,这个题真好(?) <BZOJ题面> <LOJ题面> 看到这个题,一时没有思路 但是 我想到了一个错解:归并 这个题真的有一点把我们的思路往归并上引 于是WA10 诶?我 ...
- jeecms 强大的采集功能优化 转载 https://blog.csdn.net/jeff06143132/article/details/7099003
========================================================= 没办法附件上传不了,AcquisitionSvcImpl.java类: //---- ...
- Intent 传递Map数据
android开发默认情况下,通过Bundle bundle=new Bundle();传递值是不能直接传递map对象的,解决办法: 第一步:封装自己的map,实现序列化即可 /** *序列化map供 ...
- Vue-Cli 3.0 + vue.config.js
虽然一直没有亲手搭建过vue项目,但是2.0的时候就开始自学(但并没有实践项目).然后公司最近有个人用3.0做了个项目,公司让我参与进去,我就顺便学习了一把3.0.(美滋滋) 因为电脑的环境还是之前自 ...
- Neo4j系列-简介及应用场景
1.什么是Neo4j? Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储 ...