zoukankan      html  css  js  c++  java
  • 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,去登陆

     

    ####

  • 相关阅读:
    移动开发 Native APP、Hybrid APP和Web APP介绍
    urllib与urllib2的学习总结(python2.7.X)
    fiddler及postman讲解
    接口测试基础
    UiAutomator2.0 和1.x 的区别
    adb shell am instrument 命令详解
    GT问题记录
    HDU 2492 Ping pong (树状数组)
    CF 567C Geometric Progression
    CF 545E Paths and Trees
  • 原文地址:https://www.cnblogs.com/andy0816/p/15059044.html
Copyright © 2011-2022 走看看