欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫学习笔记 - 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=)