scrapy模拟登陆
回顾:
requests是如何模拟登陆的?
直接携带 cookies请求页面
找接口发送pos请求存储 cookieselenium是如何模拟登陆的?找到对应的 input标签,输入文字点击登录 回顾:
selenium是如何模拟登陆的?
找到对应的 input标签,输入文字点击登录
Scrapy的模拟登陆
直接携带cookie
找到发送post的url地址,带上信息,发送请求
有了cookie以后之前的url都会带着cookie走,因为settings.py中的COOKIES_ENABLED中默认是True
应用场景:
cookie过期时间很长,常见于一些不规范的网站
能在 cookie过期之前把搜有的数据拿到
配合其他程序使用,比如其使用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)
Comments NOTHING