scrapy学习之爬虫练习平台3

本文首发于个人博客,文章链接为:https://blog.d77.xyz/archives/6f6e2126.html

前言

上一篇文章爬取了爬虫练习平台的 spa 部分,有 Ajax 和接口加密,没有涉及到登录,都是 GET 请求。

本篇文章继续爬后面的 login 部分,涉及到了登录和验证。

环境准备

考虑到抓取数据字段的多样性,本次爬取将数据库换成了 Mongo,不需要每次都新建字段,加快抓取速度。

新建一个名为 test 的数据库,其他环境和设置不变。

开始爬取

login1

login1 说明如下:

模拟登录网站,登录时用户名和密码经过加密处理,适合 JavaScript 逆向分析。

是一个需要登录的网站,而且有加密,需要逆向 JS。我提前分析了一下,由于登录之后并没有跳转到实际可以爬取的页面,所以就不写 scrapy 的代码了,只分析登录请求所涉及到的加密算法。

抓包分析,老方法,打开控制台,打 xhr 断点,随便输入账号密码,点击登录按钮,触发登录请求。

断在了老地方 send 方法上,顺着调用栈往上找,找找疑似在构造 data 的地方。

找到了一处,看起来是将 form 表单进行编码后传给 token,然后通过 post 函数发送出去。打断点,重新登录。

看起来是将随便输入的账号密码传入到 c.encode 这个函数中进行编码之后就得到了 token 参数,单步跟进去看看。

遇到一些 get 方法直接步出就好,直到这里,是一个三元运算符,r 为 undefined,所以会执行下边的 _encode(String(e)) 方法,单步往下走。

到了这里,往上看,_encode 也是个三元运算符,还是好几个嵌套的那种。utob 函数只是进行了正则替换,真正的编码函数是 btoa 函数,单步进入。

调用了系统的 btoa 函数,而 btoa 函数就是用来将字符串进行 base64 编码的。

所以,结论就是,账号密码被 base64 编码后赋值给了 token,然后提交给了服务器,代码如下:

data = {
   
    'username': 'admin',
    'password': 'admin'
}
url = 'https://login1.scrape.center/'
# 注意这里是 get 请求,如果是 post 请求的话会报405错误代码。
r = requests.get(url=url, data={
   'token': base64.b64encode(json.dumps(data).encode())})
print(r.text)
print(r.status_code)

代码中用的是 GET 请求(因为 GET 请求才可以成功获取服务器响应),但是在网页上用的是 POST 请求,实际测试发现 POST 请求服务器会返回 405 错误,猜测可能是后端服务没有指定请求方式的原因,不指定的话默认只接收 GET 请求。🤣🤣🤣

其实如果有点经验的人可以更快的解决问题,因为看到 token 这种大小写加数字的字符串基本上都会试一下 base64,如果不行的话再尝试逆向。

login2

login2 说明如下:

对接 Session + Cookies 模拟登录,适合用作 Session + Cookies 模拟登录练习。

无反爬,需要登录,网页结构和之前的没有区别。scrapy 中起始请求需要改成 POST 请求,并且需要通过表单提交账号密码数据,所以写法要稍微改变一下。完整代码如下:

class SSR1(scrapy.Spider):
    name = 'login2'

    def start_requests(self):
        urls = ['https://login2.scrape.center/login']
        for url in urls:
            # 添加需要提交的表单参数
            yield scrapy.FormRequest(url=url, callback=self.parse, formdata=<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值