aqistudy空气质量检测网站python爬取

url

aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24vaGlzdG9yeWRhdGEvZGF5ZGF0YS5waHA/Y2l0eT0lRTYlQjclQjElRTUlOUMlQjMmbW9udGg9MjAxMy0xMg==

base64.b64decode()

反爬机制:

1. 无限debugger,F12, 右键禁用, 窗口检测

2. 数据加密

3. ajax请求

4. 代码混淆

处理各种反扒:

1.无限debugger, F12, 右键, 窗口检测

禁用F12,右键: 不用快捷键找到并打开开发者工具(浏览器右上角三个点->更多工具-> 开发者工具),

窗口检测:开发者工具右上角三个点,将开发者工具选择独立窗口,而不是停靠网页的一侧

无限debugger:右键debugger左侧数字,选择一律不在此处暂停;

 

刷新网页后就可以进行调试了。 

刷新后发现主页面中没有数据,清除cookie(点击网址左端的小锁,选择Cookie和网站数据,点击删除),重新刷新网页,就可以抓到数据包了。

 

2. 数据加密,ajax请求, 代码混淆

多清几次cookie,刷新,会发现请求的数据是加密的,且key值是变化的。

 

因为key值不断变化,没办法直接通过搜索关键字来找数据加密逻辑,因此通过xhr断点找:

 勾上断点,清cookie,刷新:

网页断在了发送ajax请求之前,然后通过不断的单步调试,最后找到了ajax请求所在的vm文件: 

 从ajax请求内容可以看到,我们要找的数据就是p89pnAs,由函数p9cAcdlXf3jULuRd(m2OpM54Fm, ooz7uL4Rde)加密得来的,打上断点刷新:

 里面是通过md5 +  base64(后面会发现这个地方是会变化的,base64后可能会出现aes或des加密)加密,直接用python重写,或者耐心点慢慢扣js。

 成功请求到数据后,发现数据是一串加密的字符,我们要找到其加密的逻辑:

因为我们网页上看到的数据是明文的,所以一定存在解密的代码在某个js文件中(自学,个人理解),清cookie,刷新,找到ajax请求,在success后打上断点,右键执行到此处,发现

success传入的数据就是我们请求到的密文,单步调试就可以找到数据解密的逻辑了:

 数据解密逻辑:

 找到这些逻辑后,就可以准备按顺序开始写代码:加密post的data -> requests.post -> 解密数据;

加解密的时候会遇到一个问题,密钥每次加载都会变化:

 

data对应的key值也会变化,data加密的方法也会变化 (会加aes或des加密),aq0G也是变化的:

 太多变化了,第一反应就是干脆将整个文件请求出来,然后就发现是vm文件,百度知道vm文件是js使用eval函数后出现的结果, 点击网络,搜素eval:

 将eval里面的函数copy出来放到console里面跑一下,就可以找到vm文件的内容了(可能有多重加密,多跑几次直到看到你熟悉的js代码

 跑一次发现还是个eval函数,再将eval里面的内容扣出来跑:

 

 最终找到了对应的代码,

然后我们找到这个eval所在的js文件,可以发现这个js文件的url也会变: deZFrgC0SMD9R.min.js?v=1692841562, 我们通过启动器找到了它的url生成位置daydata.php

 

 

至此,所有需要的东西我们都可以获取到了。

总结一下整个流程 

1. requests.get 请求主页 -> 正则/xpath/css 获取到js文件路径:resource/js/deZFrgC0SMD9R.min.js?v=1692841562

2. requests.get 请求js文件 -> 获取到整个eval函数

3. 使用execjs反复call eval里面的函数 -> 解密后vm文件代码

4. 使用正则将aes, des的key和iv,post的data的appId, data的key值,data加密的方法(有没有使用aes,des),抓出来 -> post请求的data

def data_encode(appId, method, object, timestamp, aes_key, aes_iv, des_key, des_iv, clienttype="WEB", encode="b64"):
    judge_obj = JudgeCode()
    s = appId + method + timestamp + clienttype + object
    secret = judge_obj.judge_encode(s, encode_func=USE_MD5) # md5加密,自己网上找
    data = '{"appId":"%s","method":"%s","timestamp":%s,"clienttype":"%s","object":%s,"secret":"%s"}' % (
        appId, method, timestamp, clienttype, object, secret)
    result = judge_obj.judge_encode(str(data).encode('utf8'), encode_func=base64.b64encode).decode(encoding='utf8')
    if encode == "aes":
        # aes加密可以直接扣出来,也可以用python写(没试过python写,不知道行不行)
        result = decode_js.call("aes_encode", result, aes_key, aes_iv) 
    elif encode == "des":
        result = decode_js.call("des_encode", result, des_key, des_iv)
    return result

5. requests.post  + data 请求historydata/api/historyapi.php -> 获得加密后的数据

6. 使用aes des的key和iv解密数据,获得需要的数据

7.写入sql。

8. 代码就不贴了,多动手。因为是自学,可能很多步骤别人一眼就知道对应的代码,逻辑在哪,不需要像我一样反复清cookie,单步调试,欢迎各位大神指点一下 。

最后再贴个结果:

爬取空气质量检测网的部分城市的历年每天质量数据 思路----------------------------------------- 从某城市的空气质量网页获取某市每月的链接,再爬取每个月的表格数据。连云港市:https://www.aqistudy.cn/historydata/daydata.php?city=连云港 连云港2014年5月的空气质量:https://www.aqistudy.cn/historydata/daydata.php?city=连云港&month=2014-05 遇到的问题----------------------------------------- 获取的网页中的表格数据隐藏,尝试requests无法获取。判断可能是动态加载的网页 尝试----------------------------------------- 1. 通过XHR,js查找隐藏数据的加载网页,没有找到。 2. 使用phantomjs.get() result=pd.read_html ,可以获得隐藏的表格数据,但是并不稳定,只是偶尔出现加载的表格数据,无法大规模的获取 解决方法----------------------------------------- 查找资料得知这个网站的表格数据在Console里的items中, 使用selenium的webdriver.firefox(),driver.execute_script("return items") 数据可获得。 仍遇到的问题:----------------------------------------- 爬取一个网页可获得数据,但是连续的获取网页,会出现两个错误。 1.Message: ReferenceError: items is not defined 2.connection refused 解决方法: 1.connection refused问题,可能是网页开太多,使用driver.quit() 2. 如果 execute_script 还是出错,可尝试pd.read_html获取信息。之前用phantomjs获取的时候输出空的表格,可能由于加载不够,用 Waite直到table出现之后再获取网页 Element=wait.until(EC.element_to_be_clickable((By.XPATH,"/html/body/div[3]/div[1]/div[1]/table/tbody"))) 3.之后出现偶尔出现输出为空,使用循环,如果输出表格为空,再重新获取。 if len(result)>1: filename = str(month) + '.xls' result.to_excel('E:\python\案例程序\data\\' + filename) print('成功存入'+filename) driver.quit() else: driver.quit() return getdata(monthhref,month)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值