爬虫学习笔记 - scrapy 框架
程序员文章站
2022-05-06 20:33:08
...
文章目录
scrapy 的数据传递的流程
- 调度器 request对象—》引擎—》下载器中间件—》下载器
- 下载器发送请求,获取response—》下载器中间件–》引擎—》爬虫中间件—》爬虫
- 爬虫–》提取url,组成一个request对象—》爬虫中间件—》引擎—》调取器
- 爬虫—》提取数据—》引擎–》管道
- 管道实现数据的处理和保存
scrapy的项目流程
- 创建项目 :scrapy startproject 项目名
- 创建爬虫:cd 项目名下 ,scrapy genspider 爬虫名 allowed_domains
- 完善爬虫 :提取数据,提取url地址组成request
- 完善管道:数据的处理和保存
scrapy如何构造请求
- scrapy.Request(url,callback,meta,dont_filter)
- url:详情页,下一页的url
- callback:url地址响应的处理函数
- meta:在不同的函数中传递数据
- dont_filter :默认值false,过滤请求,请求过的不会再被请求,为True,表示会被继续请求
- yield scrapy.Request(url,callback,meta,dont_filter)
scrapy的Item如何使用
#定义
class Item(scrapy.Item):
name = scrapy.Field()
#使用
导入。使用name字典
scrapy中parse函数是做什么的
- 处理start_urls中的url地址的响应
下载器中间件
downloadmidware
process_request(request,spider): # request进入下载器之前
# 返回值
1. return None 当前request继续进入其他的下载器中间件的process_request方法或者到达下载器
2. return response 当前request不再请求,直接让response交给引擎,后续会交给爬虫去处理
3. return request 当前request不再请求,request1交给引擎进入到调度器中
# 功能
1. 设置user-agent
request.headers['User-Agent'] = "xxxx"
2. 设置代理
request.meta['proxy'] = "http://127.0.0.1:8080"
3. 设置cookies
request.cookies = cookies # cookies是一个dict类型
process_response(request, response,spider):
# 已经拿到response响应,交给引擎之前,会经过下载器中间件的这个方法
# 返回值:
1. 返回 response,进入其他下载器的中间件process_response方法,或者到达引擎,后续爬虫会处理
2. 返回 request,request交给引擎进入到调度器中
# 去重 set(可以为python的set,也可以是redis的set集合)
code = md5(resopnse.body) # 88e43d368a867431b52269d3307ef9bc
if set.put(code)==0:
# 已经存在了,说明重复了,
return request
else:
# 说明不存在
return response
crwalspider
crwalspider如何创建爬虫
- scrapy genspider -t crawl 爬虫名 语序允许爬取的范围
crwalspdier中rules的编写
- rules 元组,元素是Rule
- Rule(LinkExtractor(allow=“正则”),follow=True,callback=“str”)
- LinkExtractor:传入正则匹配url地址
- follow:为True表示提取出来的响应还会经过rules中的规则进行url地址的提取
- callback:表示提取出来的响应还会经过callback处理
crwalspider中不同的解析函数间如何传递数据,如果不能应该如何操作?
- 在前一个Rule的callback中实现手动构造请求
yield scrapy.Request(url,callback,meta)
下载器中间件如何使用
class TestMid:
def process_request(self,request,spdier):
#处理请求
request.headers["User-Agent"] = "" #使用ua
request.meta["proxy"] = "协议+ip+端口"
return None #请求会继续后面处理
return Request #把请求交给调度器
return Response #把响应交给爬虫
def process_response(self,request,response,spider):
#处理响应
return response #把响应交给爬虫
return request #把请求交给调度器
模拟登陆的三种方式
- 携带cookie进行登录
- yield scrapy.Request(url,callback=,cookies={},meta={})
- 发送post请求
- yield scrapy.FormReuqest(url,formdata={请求体},callback)
- 表单提交
- yield scrapy.FormReuqest.from_response(response,formdata={},callback=)