Scrapy模拟登陆

酥酥 发布于 2021-09-18 61 次阅读


scrapy模拟登陆

回顾:

requests是如何模拟登陆的?

  1. 直接携带 cookies请求页面

  2. 找接口发送pos请求存储 cookieselenium是如何模拟登陆的?找到对应的 input标签,输入文字点击登录 回顾:

selenium是如何模拟登陆的?

  1. 找到对应的 input标签,输入文字点击登录

Scrapy的模拟登陆

  1. 直接携带cookie

  2. 找到发送post的url地址,带上信息,发送请求

有了cookie以后之前的url都会带着cookie走,因为settings.py中的COOKIES_ENABLED中默认是True

应用场景:
  1. cookie过期时间很长,常见于一些不规范的网站

  2. 能在 cookie过期之前把搜有的数据拿到

  3. 配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地, scrapy发送请求之前先读取本地cookie

start_urls是谁来发的

是yield Request来构造的,且没有callback,这种情况默认就是交给parse函数处理了,源码中使用的方法是def start_requests(self)由此我们得到启发,是不是可以在自己的代码中重新定义start_requests(self),就可以自定义一些headers等

Scrapy cookie维护机制
1. 第一个 源码的 注释状态:

 

				
					# Disable cookies (enabled by default) # COOKIES_ENABLED = False
				
			

这个状态下, 其实可以理解成 cookie 是开启的状态, 但是他的获取值 是通过源码的方法, 直接获取到上层的cookie ,然后带到下一层去的。

2. 第二种解开注释的情况下 :
				
					# Disable cookies (enabled by default) COOKIES_ENABLED = False
				
			

这个状态下的 cookie 是通过 headers 添加上去的 ,就是 setting源码中的

				
					# Override the default request headers: #DEFAULT_REQUEST_HEADERS = { #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', #   'Accept-Language': 'en', #   'cookie:' #}
				
			
3. 第三种状态 就是 设置为 true:
				
					# Disable cookies (enabled by default) COOKIES_ENABLED = True
				
			

这种的, 就是覆盖源码中的方法, 后面使用的是自己的cookie , 需要在请求的时候 带上 cookies= cookie , cookie 自己设置到 setting 或者 spider 里面都可以。 这个设置是 全局设置的 。 以后的请求都是这个cookie 。

分析:
每个请求需要自己的 cookie、 token的 , 请使用 第二种。
直接全局可以使用一个cookie 的 、只需要这个字段的 , 用第三种。
两者的cookie 相斥, 简单理解就是 有 headers (第二种), 单独设置的cookie(第三种 就会失效),反之亦然。

法一:直接携带cookie登录

1. 在headers中加入
				
					def start_requests(self):  
        headers = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", "cookie":"你的微博cookie" }  
        url = "https://weibo.com/u/{}".format("你的微博id")
        yield Request(url, callback=self.parse, headers=headers)
				
			
  • 那么需要把settings.py的COOKIES_ENABLED设置为false
				
					COOKIES_ENABLED = False
				
			

这个改了settings.py中的COOKIES_ENABLED为False就会出问题,以后的访问不会携带cookie了需要手动维护

2. 用cookies=cookies的方式加入

此时需要

				
					COOKIES_ENABLED = True
				
			
3.多个url使用cookiejar

此方法也受COOKIES_ENABLED=True的影响

				
					class CookieTestSpider(scrapy.Spider):
  name = 'usecookie'
  cookie_dict = {
      "SUB": "你的微博cookie"}
  headers = {
      "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
  }
  weibo_id = "你的微博主页id"
  def start_requests(self):
      url = "https://weibo.com/u/{}".format(self.weibo_id)
      yield Request(url, callback=self.parse, headers=self.headers, cookies=self.cookie_dict, meta={'cookiejar': 1})

  def parse(self, response):
      source = response.text
      url = "https://weibo.com/u/{}".format(self.weibo_id)
      if u"我的主页" in source:
          print "找到了"
          yield scrapy.Request(url, headers=self.headers, meta={'cookiejar': response.meta['cookiejar']},callback=self.parse_page, dont_filter=True)
      else:
          print "没有cookie"
  def parse_page(self, response):
      source = response.text
      if u"我的主页" in source:
          print "又找到了"
      else:
          print "没有cookie"
				
			

在meta中添加cookiejar这个属性。这个键必须这个名,后面的话可以是从0开始的值,推荐使用start_url列表的下标

也可以在中间件request_process中request.cookie={}去操作

后面需要使用cookie地方使用meta={‘cookiejar’: response.meta[‘cookiejar’]}即可。
这种方法的好处:这种是通过meta的方式,将为spider维护多个独立的cookie会话。如果使用cookies ={},则必须手动维护单独的cookie会话。

COOKIES_DEBUG能够展示COOKIES在网站中的传输路径

法二:表单请求的提交

使用scrapy.FormRequest(url,formdata,callback)去实现
formdata为字典类型数据上传表单,这里的formdata是需要全部的信息
使用scrapy.FormRequest.from_response(response,formdata,callback).#此时formdata只有input标签的键值对,海包括了一系列定位form用来处理多form表单的网页的方法

后者会让input hidden项目自动赋值,比如csrf_token等

yield scrapy.Request(method="post",body=formdata)