【python专场】20220806 qimai爬虫请求参数加密analisys解析以及代理使用

提示:文章写于20220803,持续更新中,可以去专栏查看最新版本哦,如有不解或错误,请务必批评指正!


前言

在工作中不论是不是it行业,总会遇到采集数据的工作,近期有一个“朋友”需要七麦的app应用数据,而我打开浏览器,“撇”了一眼链接,打开f12,看了一眼get请求,30秒后,想也没想就答应了,并且1小时搞定。。。后来。。就没有后来了。。。
ps:如果没有耐心去研究的话,真的不如手工点。

简介:

1、请求参数加密解析过程,附带源码
2、代理使用方案进化过程


一、请求分析

1、因为数据源来自XHR异步请求,所以这边不需要bs4去解析html,直接上图:
在这里插入图片描述

----- 这里我们发现每个请求都有个analysis,刚开始以为是base64加密,结果解密一看好像还有点东西
2、刚开始也是和大家一样能站在巨人的肩膀上,于是就去搜了一下大神们的解析,结果还真有,于是就直接按照大神们的写法直接抄上去了,结果发现好像没有成功,心情再次低落。。。不过还是要做的嘛。于是乎,我们开始了不情愿的解析现在七麦更新后的加密算法:
在这里插入图片描述

首先开搜,发现这个请求的位置(注意有两个matches,我是搜安卓的请求上面的那个是苹果的),于是乎打断点跟进(压缩后的js确实很看的很难受,但是我好像发现一个办法找到方法的位置)
在这里插入图片描述
虽然穿了马甲,但是还是可以找到你,嗨害嗨~
在这里插入图片描述
这个地方对于后端出生的我找起来有点困难,应该是r()返回一个方法,直接看r是看不到里面的,这里需要看r()整体,发现返回的请求工具类中有一个拦截器(intercepter),对于request请求有个handler处理器,处理器对当前请求做了一个填充(fulfilled),所以这里需要进入填充的代码逻辑,我们继续:
在这里插入图片描述

这里就是填充的全部逻辑了,看起来不知道干了啥,但是通过debug看每一步的结果就能够看清楚了,这里对当前请求做出了如下处理:
1、首先获取一个时间戳,o变量,这里f变量经过测试没有什么太大的用,设置为0就可以
2、接下来4055行到4061行做了两件事,将入参放入到r数组中,并对r的参数进行排序后转为字符串。
3、注意这里,n.cv进去发现就是base64加密,可以通过前面的方式进入到源码,通过base64解密一下这里的加密串看看是不是base64加密,到4063行时,参数字符串已经被加密完成了
在这里插入图片描述

4、接下来发现d=’@#‘,所以到4066行之后:
r = base64(参数字符串) + ’@#‘ + url(去掉baseURL) + ’@#‘ + 时间戳 + ’@#‘ + 1 ,如图:
在这里插入图片描述

5、n.oZ这里其实就是加密算法了:
在这里插入图片描述
其实就是将r字符串中的每一位做了charcode转换后,又做了简单的偏移和异或计算计算重新赋值回r,小伙伴自己debug的话是可以看懂的。
6、执行后回到上一个堆栈
在这里插入图片描述
终于在这找到了主角analysis!后面对结果a做了urlencode操作,a就是r字符串被n.oZ后,再base64的结果:
在这里插入图片描述
到这里请求的分析就结束了,总结一下:
analysis = uriEncode(base64(n.oZ(base64(参数字符串) + ’@#‘ + url(去掉baseURL) + ’@#‘ + 时间戳 + ’@#‘ + 1)))
其中n.oZ函数为自定义的加密算法,可以手动实现,不算麻烦
到这里已经可以看到请求成功了,不再参数异常了
在这里插入图片描述

二、代理方式

1.代理原因:

经过了请求分析后我也以为就直接开爬,结果10次请求没到,就gg了,请求接口返回code:10605,msg大家自行查看

2.解决方案

首先代理分三个等级:
透明、普代、高代
1、透明:服务器知道你用的代理,并且知道你的公网ip,所以你还敢用吗?
2、普代:服务器知道你用的代理,但是不知道你的公网ip,应该勉强能用
3、高代:服务器不知道你用的代理,所以怎么知道当前ip是不是你的公网呢?
这里通过请求提供免费代理ip的网址(自己搜:快代理之类的),能找到很多ip,但是质量都很差,所以呢,这里需要你自己去实现一个生产者消费者的数据结构,其实也不难,一劳永逸嘛

3、方案实现

实现方案很简单,通过一个编译单元(java里的文件叫法,python不知道是不是),纳管一个dq双端队列对象,这里dq对象在多线程的情况下能够帮你解决线程同步的问题,不用再去自行加锁了。
再给两个文件,一个文件专门用来做七麦请求的,一个文件专门做代理ip的。
七麦请求文件:这个文件可以是任何网站的请求,这里不限制,请求时使用dq中的ip作为代理,如果代理ip请求失败则从dq中删除这个代理。
代理ip文件:这个文件就是开启多线程对你收集来的所有代理ip的网站进行爬取ip+端口,然后通过httpbin进行检查是否能用,如果能用就往dq里面插入这个ip供请求端使用

4、代码实现

获取代理网中的ip

    for i in range(1, 4705):
        try:
            req = requests.get("代理ip提供网址", timeout=5)
            html = req.text
            req.encoding = "utf-8"
            soup = BeautifulSoup(html, features="html.parser")
            iplist = soup.select('.hot-product-content tbody tr')
            for tag in iplist:
                try:
                    if availableIP != "":
                        return
                    ipport = tag.findAll('td')[0].text + ":" + tag.findAll('td')[1].text
                    print(ipport)
                    proxies["https"] = ipport
                    rsp = requests.get(testProxyUrlHTTPS, proxies=proxies, timeout=5)
                    print("wa!!!!!!!,找到一个!:", json.loads(rsp.text))
                    GlobalPost.append(ipport)
                    print("#####当前ip可用列表:############3")
                    GlobalPost.printList()
                    print("###############################3")
                    # print(tag.findAll('td')[1].text)
                except:
                    print("不可用ip:", ipport + "   ", end="")
                    continue
        except:
            continue
        finally:
            if  i == 20:
                i = 1

纳管一个双端队列

# 全局变量,作为邮差
import collections



# dq队列作为变量传递
def initDq():
    global dq
    dq = collections.deque()


def pop():
    return dq.pop()


def append(a):
    try:
        dq.index(a)
    except:
        dq.append(a)


def size():
    return dq.__len__()

def get(index):
    return dq.__getitem__(index)

def remove(e):
    try:
        dq.remove(e)
    except:
        return

def printList():
    for i in dq:
        print(i)

if __name__ == '__main__':
    initDq()
    append("123")
    append("345")
    printList()

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可咨询2260755767@qq.com或在评论区回复即可.

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值