全站数据爬取:
将网站中某板块下的全部页码所对应的信息爬取
Scrapy中
Yield scrapy.requests(url= ,callback=self.parse)
#手动请求发送:callback回调函数是专门用作于数据解析,,类比递归
-请求传参
-使用场景:如果爬取解析的数据不在同一张页面中(深度爬取)
–中间件:
—位置: 引擎和下载器之间
----作用 :批量拦截到整个工程中所有的请求和相应
----拦截请求:
----ua伪装
----代理ip
-----拦截相应:
—篡改响应数据,相应对象
Middlewares.py 是中间件的方法集
可以只保留这三个
Process_request用于拦截请求
#ua伪装
Request.headers[‘user-agent’] =’xxx’
#或者搜索ua池,让该池随机出一个赋值
_response 用于拦截回应
_excption 用于拦截异常
#代理 同样应用代理池
If request.url.split(“:’)[0]==’http’:
Request.meta[‘proxy’]=random.choice(self,list_name)
Else :
Pass
Return request #将修正后的请求对象重新发送请求
将setting中的打开
如果解析时遇到动态加载的页面要使用中间件处理
对 process_response 编写
#挑选出指定的响应对象进行篡改
#通过url指定request 通过request指定response
If request.url in spider.models_urls:
//针对定位到的这些进行篡改,实例化一个新的响应对象(符合需求:包含动态加载出的新闻数据),替代旧的相应对象 所以要导包
from scrapy.http import HtmlReponse
New_reponse=HtmlResponse(url,body,encoding,request)
return new_reponse
else:
return reponse
crawl spider:基于spider的一个子类
—全站数据爬取的方式
使用:
—创建一个工程
–cd xxx
—创建的爬虫文件(基于crawlspider):
—scrapy genspider -t crawl 爬虫文件名 www。Xxxx。Com
#链接提取器
link=LinkExtractor(allow=r'Items/')
—链接提取器:
对链接进行提取,根据指定规则进行指定连接提取
Allow表示制定好的规则,等号后面表示正则表达式
Rules=()表示规则解析器 将连接提取器渠道的链接进行指定规则(callback)的解析操作
Follow=true时可以将链接提取器继续作用到 链接提取器提取到的连接 所对应的链接中
Xpath解析器中不能出现tbody标签,如果出现就使用//跳过
分布式爬虫:
—概念:我们需要搭建一个分布式的集群,让其对一组资源进行分布爬取
–作用:提升爬取数据的效率
–如何实现分布式?
–安装scrapy-redis 的组件
—原生的scrapy不可以实现分布式,必须要scrapy结合组件一起实现分布式爬虫,调度器不能共享,管道不能共享
—组件作用:
---- 给原生scrapy框架提供可被共享的管道和调度器
---实现流程:
—创建工程
—创建基于crwalspider的爬虫文件
–修改当前爬虫文件
–导包from scapy_redis.spiders import RedisCrwaSpider
– 将start_urls和allowed_domains进行注释
使用redis_key=”” 进行代替 可以被共享的调度器队列的名称
—将爬虫的父类改成RedisCrwaSpider
—修改settings文件
–指定可以使用的管道
–指定调度器
增量式爬虫:
概念:
检测网站数据更新的情况,只会爬取网站最新更新出来的数据。
–分析:
–制定起始的url
–基于crwalspider获取其他页码链接
–基于rule将其他页码链接进行请求
–从每个页码对应的页面源码中解析出每一个电影详情页的url
–检测电影详情页的url之前有没有请求过
–将爬取过的电影详情页的url存储
–存储到redis的set数据结构
–对详情页的url发起请求,然后解析出电影名称和简介
–进行持久化存储