scrapy框架使用-模拟登陆,使用cookie登陆,使用post登陆,使用selenium模拟登陆

####

scrapy模拟登陆1---使用cookie登陆

有些网站的cookie过期时间很长,比如一些小网站,

我们可以保存这个cookie,然后携带cookie登陆,

如果操作:

思考,这个start_urls是谁发起的?

这个是在爬虫继承的父类,spider里面,有一个start_requests,这个方法发起的请求,

我们的操作就是重写这个方法,

import scrapy
import re


class Spider3Spider(scrapy.Spider):
    name = 'spider3'
    allowed_domains = ['360doc.com']
    start_urls = ['http://www.360doc.com/myfiles.aspx']

    def start_requests(self):
        cookies = "XXX"  # 复制自己的cookie
        cookies = {i.split("=")[0].strip(): i.split("=")[1].strip() for i in cookies.split(";")}
        # print(cookies)
        yield scrapy.Request(
            self.start_urls[0],
            callback=self.parse,
            cookies=cookies,
        )

    def parse(self, response):
        result_list = re.findall(r'andylee0816', response.body.decode())
        print(result_list)


if __name__ == '__main__':
    from scrapy import cmdline

    cmdline.execute("scrapy crawl spider3 --nolog".split())

 ###

 ###

重点是要体会这种思想 

这种方式的缺点,就是cookie会失效,

记住这种for循环的方式发起请求,这样每次都会携带cookie登陆了???

这种要测试一下,才能理解的更深刻,

####

scrapy模拟登陆2---使用post请求登陆

####

前面学过了,可以parse返回一个request,这里是一个formrequest,也就是带参数的请求,就是post请求,

模拟登陆github,

注意这个formdata,有一个token是变化的,

这个在login这个url里面是有定义的,可以找到,

 

####

##

注意,组成的post数据,key不需要写引号, 

这种就是使用post登陆,

####

###

###

###

这种方法是scrapy里面正统的登陆的方法,但是这个不是所有的网页都能行的,有一些网站登陆用这个方法就不行!!!

这个必须要知道,

但是你要体会这种登陆的思想,懂不,重要的是思想,

###

这个方法会自动去寻找form表达,我们只需要写用户名,密码就可以了,

但是如果有两个表单怎么办?

看看源码,可以定位具体的某一个表单,

但是这种只能用于没有验证的登陆,如果有验证其他的东西,就没有这么简单了,

如果密码post传递的时候加密了,就要找到js代码,看看怎么加密的,你加密之后传递就可以了,

####

上面的formrequest的登陆方式如果有验证码,就是无解的,

而使用cookie又是出现cookie失效的问题,

###

第三种方法,就是使用selenium登陆,这种才是好办法,

scrapy结合selenium模拟登陆----直接selenium拿到response返回

这种方法需要学习一下,这个算是一个通解,

比如模拟登陆淘宝,

下载中间件:

所以这个selenium也是在下载中间件来做文章的,

处理了请求

  

###

有关信号的知识,还是需要认识看一下,

这种登陆,还是强依赖selenium的,是否有办法,可以直接通过selenium拿到cookie,然后通过cookie登陆呢,

###

scrapy结合selenium模拟登陆----只使用selenium一次,拿到cookie之后,使用requests请求链接把response返回

爬虫

中间件

 

 可见从上面的例子,可以看到,

我们可以通过selenium登陆,然后拿到cookie,然后通过requests携带cookie登陆,返回这个response,

那就厉害了,也就是说,每次爬虫处理的response,都是requests携带cookie请求过的,那这样就可以实现登陆了,

####

这种方式还有问题,是不是可以直接把cookie拿到,然后传递过scrapy呢,不要requests的参与,

也就是scrapy构造后续请求传递cookie的时候,都是把拿到的cookie携带访问的,

####

scrapy结合selenium模拟登陆----只使用selenium一次,拿到cookie之后,把cookie交给scrapy,后续都是scrapy的事情

我们要知道,scrapy的cookie形态,和selenium的cookie形态是不一样的,前者是一个列表,里面一个字符串,而后者是一个里面,里面是字典格式的cookie,

 所以这个应该放到哪里比较好,就是这个下载中间件的process_request里面,对请求进行处理,给他加上cookie,

 ######

###### 

scrapy结合selenium模拟登陆----只使用selenium一次,拿到cookie之后,放到一个文件中,为了后续能在分布式中传递数据,

还可以把这个cookie放到文件中,然后通过文件来访问cookie,去登陆

 

####

原文地址:https://www.cnblogs.com/andy0816/p/15059044.html