1. 为什么需要模拟登陆?
获取cookie,能够爬取登陆后的页面的数据
2.使用cookie模拟登陆的场景
(1) cookie过期时间很长,常见于一些不规范的网站
(2) 能在cookie过期之前把搜有的数据拿到
(3) 配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到,然后保存到本地,
scrapy发送请求之前先读取本地cookie
3. 在一个scrapy的项目创建好之后,爬虫的py文件里面的start_urls = [] 里面的url地址是谁来请求的?
可以点击进入到Spider类中的源码中,发现start_urls 列表中的url是由里面的start_resquests()方法执行的,方法里面又 调用了 make_requests_from_url()
4. .重写父类中start_requests()方法
设置cookies,把cookies的字符串形式转化为字典的形式
在yield scrapy.Request()中设置cookies参数
默认在settings里面已经开启了cookiess,下次请求时会带上,上次请求的cookies
在settings里面设置 COOKIES_DEBUG = True 可以看见cookies在不同的请求里面传递的过程是怎样的
前提是不设置 LOG_LEVEL
5. 利用cookie模拟登陆人人网
首先登陆进去人人网,把登陆进入之后的对应的cookie复制出来
然后在项目的爬虫文件中,进行逻辑代码的编写
# -*- coding: utf-8 -*- import scrapy import re class RenrenSpider(scrapy.Spider): name = 'renren' allowed_domains = ['renren.com'] start_urls = ['登陆人人网之后的网址'] '''重写父类的start_requests方法''' def start_requests(self): cookies = "自己登陆人人网之后的=cookie" '''转化为字典的形式''' cookies = {i.split("=")[0]: i.split("=")[1] for i in cookies.split("; ")} yield scrapy.Request( self.start_urls[0], callback=self.parse, cookies=cookies # 设置cookie参数 ) def parse(self, response): '''我们之匹配到和自己用户名一样的字符串,如果匹配到则说明已经匹配到的登录之后的数据,模拟登陆就成功了''' print(re.findall("自己人人网的用户名", response.body.decode())) yield scrapy.Request( "登陆之后的个人信息网址", callback=self.parse_detial ) def parse_detial(self, response): print(re.findall("自己人人网的用户名", response.body.decode()))
6. 然后我们运行程序之后,就可以看见,匹配到了登录之后的自己人人网的用户名
7. 我们还可以在scrapy.Request() 里面设置headers参数
def start_requests(self):
cookies = "自己登陆人人网之后的=cookie"
'''转化为字典的形式'''
cookies = {i.split("=")[0]: i.split("=")[1] for i in cookies.split("; ")}
'''设置headers参数,也可以加一些更多的请求头'''
headers = {"Cookie":cookies}
yield scrapy.Request(
self.start_urls[0],
callback=self.parse,
headers=headers # 设置headers参数
)