Scrapy如何模拟登录

614 阅读5分钟

前言

正常的模拟登录,我们知道一般会运用到cookie或者是通过post请求去提交表单数据例如我们的账号和密码。那么Scrapy框架该如何模拟登录呢?今天咱们一起来探讨一下

Scrapy模拟登录其实和传统方式差不多,也是可以通过携带cookie和通过post请求去提交表单数据这两种方式来进行模拟登录。那么今天咱们就这两种方式来分别举例

  • 案例一 携带Cookie模拟登录人人网

  • 案例二 发送post请求携带表单数据模拟登录github

实现流程

模拟登录 人人网站

这个是人人网的首页,默认是没有登录的情况。那么我们先手动的登录一下

现在进入的是个人主页这一专栏。那么我们现在开始通过Scrapy来实现模拟登录XX网

import scrapy
class RenrenSpider(scrapy.Spider):
    name = 'renren'
    allowed_domains = ['renren.com']
    start_urls = ['http://www.renren.com/974676254/profile']
    
    def parse(self,response):
          pass

关键是我们该在什么地方携带cookie呢?我们现在要模拟登录人人网。那也就意味着我们要像start_urls发送请求并且携带cookie。

但是大家需要注意的是 我们这个start_urls已经是响应完之后的结果了。我们真正是需要一个函数来帮我们来携带cookie。有同学说这个parse函数不可以吗?

这个parse函数是我在请求完start_urls之后所获得的相应。也就是你请求start_urls之前已经要携带cookie.所以在parse这个函数里面处理是不行的。那我们怎办呢?在源码中我们发现有个函数start_requests()方法,我们接下来只需要重写这个方法就可以了

def start_requests(self):
        # 携带cookie
        cookies = 'anonymid=kbyuf6hrd7m593; depovince=GW; _r01_=1; JSESSIONID=abct2vOJieNBeeMrck6lx; ick_login=32d66f36-264d-4c14-afcf-ecb76ddec100; taihe_bi_sdk_uid=0cedc61ad5d9af80d37348e520514949; taihe_bi_sdk_session=cff67df5db14ab486db8bb76b38da23c; _de=462824AA9BC689A2247380B22A94C474696BF75400CE19CC; t=5b6dfc752d52fa1f1826d6658416e2714; societyguester=5b6dfc752d52fa1f1826d6658416e2714; id=974676254; xnsid=5d748db; jebecookies=75b15dca-aff5-4073-91e2-8d9c5e4521b2|||||; ver=7.0; loginfrom=null; jebe_key=6e2a29a2-f0f9-40fb-8299-a9b579ebef0d%7Cbd5a1aba8e897ca35d9faabeb72dc675%7C1593334944806%7C1%7C1593334944927; wp_fold=0'
        cookies = {i.split('=')[0]:i.split('=')[1] for i in cookies.split('; ')}
        yield scrapy.Request(
            url=self.start_urls[0],
            callback=self.parse,
            cookies=cookies
        )
    def parse(self, response):
        # 保存文件
        with open('renren.html','w',encoding='utf-8') as f:
            f.write(response.body.decode())

我们用浏览器打开看一下页面是否是我们的个人主页,如果是个人主页证明我们已经模拟登录成功了。如下图所示确实是我们的主页

模拟登录Github

我们还是先看下页面结构

通过这个页面结构,我们发现了表单里面有我们登录的相关数据,也就是我们去登录的时候只需要把这些数据一起进行提交就可以进行模拟登录了。关键是这些数据在哪里呢? 注意 login 和 password是我们的账号和密码

如果都在页面中,那么就简单许多了。我们可以尝试的去页面找一下

OK,数据都在页面中,接下来代码的逻辑就比较简单了。

import scrapy
class GithubSpider(scrapy.Spider):
    name = 'github'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/login']

    def parse(self, response):
        commit = 'Sign in'
        authenticity_token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()
        ga_id = response.xpath("//input[@name='ga_id']/@value").extract_first()
        login = 'xxxx'
        password = 'xxxx'
        # webauthn_support = 'supported'
        # webauthn_iuvpaa_support = 'unsupported'
        timestamp = response.xpath("//input[@name='timestamp']/@value").extract_first()
        timestamp_secret = response.xpath("//input[@name='timestamp_secret']/@value").extract_first()
        # print(authenticity_token)
        # 定义一个字典提交数据
        post_data = {
            'commit':commit,
            'authenticity_token': authenticity_token,
            # 'ga_id': ga_id,
            'login': login,
            'password': password,
            'webauthn-support': 'supported',
            'webauthn-iuvpaa-support': 'unsupported',
            'timestamp': timestamp,
            'timestamp_secret': timestamp_secret,
        }
        yield scrapy.FormRequest(
            url='https://github.com/session',
            formdata=post_data,
            callback=self.after_login
        )
    def after_login(self,response):
        print(response)

运行效果

对于不了解Scrapy框架的同学来说有一点难度。只要学习过Scrapy框架的同学,相信马上可以动手操作了。先理解思路,在动手去做。当然登录的方式也不只是这2种情况。最后还是要怀着感恩之心,学习技术没有问题,不要恶意爬取网站的数据。