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,去登陆

     

    ####

  • 相关阅读:
    C++高精度乘法
    经典的7种排序算法 原理C++实现
    c++ STL
    二分查找c++
    洛谷P1111 修复公路
    01背包写法
    c++编码规范
    github教程
    windows10锁定屏幕聚焦图片导出
    week 6 Spring history and design philosophy
  • 原文地址:https://www.cnblogs.com/andy0816/p/15059044.html
Copyright © 2011-2022 走看看