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函数是做什么的
下载器中间件
downloadmidware
process_request(request,spider):
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
process_response(request, response,spider):
1. 返回 response,进入其他下载器的中间件process_response方法,或者到达引擎,后续爬虫会处理
2. 返回 request,request交给引擎进入到调度器中
code = md5(resopnse.body)
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"] = ""
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=)