js混淆加密--天气网爬虫

it2025-10-20  6

混淆加密网站

今天在爬取污染物时遇到下面网站,总的来说碰到了两大方面的爬虫难题。(混淆加密和debug检测)。

待爬取的网站

数据获取

一开始就遇到右键禁用,debug检测。

没办法,ctrl+s,直接把网站保存到了本地。

这样可以f12了,找到主页面,一通找,找到了ajax请求的代码。

传入城市、月份,然后调js中的方法,接着ctrl+shift+f,全局搜索这玩意。

复制到本地一看,好么,js混淆,找了个反混淆js。

复制到本地,一通ctrl+c,终于找到下列代码,一看逻辑,先加密传入的参数,在post请求,获取加密后的结果,在解密结果。

理清思路,终于可以写代码了。

注意一下,每个人的加密参数(或者隔一段时间)不一样,所以大家复制我的不一定后面能跑,自己可以使用这套路获取自己的js。

python代码

# -*- coding: utf-8 -*- import execjs import json import requests import datetime class pollutionSpider: """ 爬取https://www.aqistudy.cn/historydata/daydata.php 污染物数据 """ def __init__(self): self.js_path = "../data/aqistudy.js" self.main_url = 'https://www.aqistudy.cn/historydata/api/historyapi.php' self.month_data = {"1": "01", "2": "02", "3": "03", "4": "04", "5": "05", "6": "06", "7": "07", "8": "08", "9": "09", "10": "10", "11": "11", "12": "12"} self.save_path = "../data/weather/" self.headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/71.0.3578.80 Safari/537.36 ' } self.data_headers = "time_point aqi pm2_5 pm10 so2 no2 co o3 rank quality" def encrypt(self, city, month): """ 加密信息 """ js_str = self.get_js() ctx = execjs.compile(js_str) # 加载JS文件 return ctx.call('pLoXOmdsuMMq', "GETDAYDATA", {"city": city, "month": month}) def decrypt(self, data): """ 解密信息 """ ctx = execjs.compile(self.get_js()) # 加载JS文件 return ctx.call('dSMkMq14l49Opc37Yx', data) def get_js(self): """ 获取js """ f = open(self.js_path, 'r', encoding='utf-8') # 打开JS文件 line = f.readline() html_str = '' while line: html_str = html_str + line line = f.readline() return html_str def get_response(self, params): """ 请求数据 """ return requests.post(self.main_url, data={'hzbDyDmL0': params}, headers=self.headers).text def get_single(self, city, month): """ 获取一个城市某个月的数据 """ encrypt_data = self.get_response(self.encrypt(city, month)) data = json.loads(self.decrypt(encrypt_data))['result']['data']['items'] result = ['\t'.join([str(value) for key, value in element.items()]) for element in data] return result def get_all(self, city, start_day): """ 获取一个城市污染数据 """ print("开始获取" + city + "数据------------------------") start_day = datetime.datetime.strptime(start_day, "%Y-%m-%d") end_day = datetime.datetime.now() months = (end_day.year - start_day.year) * 12 + end_day.month - start_day.month month_range = ['%s%s' % (start_day.year + mon // 12, self.month_data[str(mon % 12 + 1)]) for mon in range(start_day.month - 1, start_day.month + months)] f = open(self.save_path + city + ".txt", "w", encoding="utf8") f.write(self.data_headers + "\n") for element in month_range: try: data = self.get_single(city, element) for line in data: f.write(line + "\n") print(element + city + "数据获取------------------------成功") except Exception as e: print(e) print(element + city + "数据获取------------------------失败") f.close() if __name__ == '__main__': pollutionSpider().get_all("上海", "2015-1-1")

结果

最新回复(0)