URL REST参数编码规则解析与Python高效爬取方案咨询
土地公开数据站点URL参数规则破解与采集优化
对接站点资源定位规则
当前对接的公开免费数据站点通过REST路径参数定位资源,三类土地业务资源的访问URL如下:
- 在线DCR(土地变更费用缴费凭证):
http://XXX/pages/doc?data=21192 - Khatian(土地权属法定证明文档):
https://XXX/qr-vk/b59e7 - Dakhila(土地税款缴费凭证):
https://YYYY/MVBDSzI4UTYzdUsydFJLZGJwT0x2
核心需求为探明三类URL参数21192、b59e78、MVBDSzI4UTYzdUsydFJLZGJwT0x2Z9的生成规则,重点突破前两类短参数的编码逻辑,替代原有百万级请求量的暴力枚举方案,提升采集效率。
原有暴力枚举采集实现
最初采用小写字母+数字全排列的方式枚举参数发起请求,该方案需要发起百万级请求,耗时长、有效返回占比极低,实现代码如下:
#!/usr/bin/python -tt # -*- coding: utf-8 -*- import requests import string import itertools import PyPDF2 from pathlib import Path import os import sys import random asciiletters =list(string.ascii_letters) lowercases =list(string.ascii_lowercase)[:] numbers = list(map(str,list(range(0,10))))[:] for nmbr in numbers: codes_chunk_to_write = [] prmlist = numbers+lowercases random.shuffle(prmlist) idlist = itertools.permutations(prmlist,6) for id_ in idlist: code = 'b'+nmbr+''.join(id_) url = 'https://XXX/qr-vk/'+code pdfname = code+'.pdf' response = requests.get(url) if "@@@@@@" in response.text: pdf_response = requests.get('https://XXX/qr-print/'+code) with open(pdfname, 'wb') as f: f.write(pdf_response.content) print(f"Completed {code}")
已验证的参数编码规律
此前的错误判断认为这类参数是无业务含义的随机唯一标识,无法建立参数与返回内容的关联,但实际测试已经验证参数与返回PDF内的业务编号存在明确映射关系:
- 第一类DCR参数规则已完全明确:访问
http://XXX/pages/doc?data=21192返回的PDF中包含孟加拉语数字৪৭০৬,对应阿拉伯数字4706167;十六进制值21192转十进制结果为347061,仅需在数值前拼接1位分区代码3即可匹配对应业务编号片段。 - 第二类Khatian参数规则尚未完全破解:访问
https://XXX/qr-vk/b59e7返回的PDF中包含孟加拉语数字৪৭০৬১,对应阿拉伯数字47061;十六进制值b59e7转十进制结果为304706,数值前2位30为分区代码,拼接后末尾还需补1位数字即可匹配完整业务编号,该末尾数字的生成规则暂未探明。 - 第三类Dakhila的长参数暂未开展规律验证。
核心诉求
需要补全第二类短码末尾数字的生成逻辑,得到完整的参数生成/解码规则,替换现有低效的暴力枚举逻辑,大幅压缩无效请求量,提升采集效率。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

