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地址的响应
crwalspider
- 创建命令:Scrapy genspider -t crawl 爬虫名 允许爬去的范围
- Rule中:
- callback:连接提取器提取的url地址的响应的处理函数
- follow:连接提取器提取的url地址的响应是否会继续被Rule来提取数据
下载器中间件
- 使用代理
- request.meta[‘proxy’] = “协议+ip+端口”
- process_request(request,spider)
- return None ,请求继续被下载器执行
- return resposne ,response直接返回给引擎交给爬虫
- return request, request通过引擎交给调度器
- process_response(request,response,spider)
- return response ,通过引擎交给爬虫
- return request ,通过引擎交给调度器
模拟登陆之携带cookie
-
cookie字典传递给请求的cookies参数
yield scrapy.Request( url, callback=self.parse, cookies=cookie_dict, # headers = {"Cookie":cookies_str} )
模拟登陆之发送post请求
yield scrapy.FormRequest(
"https://github.com/session", #url
formdata=formdata, #请求体
callback=self.parse_login
)
模拟登录之表单提交
#发送请求
yield scrapy.FormRequest.from_response(
response,
formdata=formdata,
callback = self.parse_login
)
正则比倒是忽略大小写
- re.I/re.IGNORECASE
scrapy 实现生成指纹的方法
默认使用sha1加密了请求方法,请求体,和请求url地址,得到16进制字符串
fp = hashlib.sha1()
fp.update(to_bytes(request.method))
fp.update(to_bytes(canonicalize_url(request.url)))
fp.update(request.body or b'')
cache[include_headers] = fp.hexdigest() #指纹
要查看数据是否存在于redis的集合中,如果不存在就插入
added = self.server.sadd(self.key, fp)
#added= 0 表示存在
#added!=0 表示不存在,并且已经插入
return added == 0
scrapy_redis和scrapy中request入队的条件
- request对象没见过,新的request
- dont_filter = True 不过滤的情况下会反复抓取
- start_urls 中的url能够被反复抓取