图片真实地址提取

来源:互联网 发布:淘宝网商城官方网站 编辑:程序博客网 时间:2024/04/28 11:56

最近学习爬虫从网上批量下载图片,但是在从百度搜索的页面下载图片时遇到的难题。搜索到的图片地址已被加密。通过搜索资料得知,加密后的字符串除了特殊符号,其他与真实字符一一对应,于是尝试通过大量对比,找出图片地址的加密映射。


首先需要获得加密地址和真实地址,在访问的第一个页面能从网页源代码中获得真实地址。于是提取了第一个页面的真实地址和加密后的地址

def make_url_list():    source_url = []    url = 'http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fr=&sf=1&fmq=1449826069912_R&pv=&ic=0&nc=1&z=&se=&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=高清动漫图片'    r = requests.get(url)    r.encoding = 'utf-8'    for index, line in enumerate(re.findall(r'"objURL":"(.*?)"', r.text)):        # print('index:{} line:{}'.format(index,line))        source_url.append(line)    after_url = []    url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=0&rn=30&gsm=200003c'    r = requests.get(url)    r.encoding = 'utf-8'    for index, line in enumerate(r.json()['data']):        try:            # print('index:{} line:{}'.format(index,line['objURL']))            after_url.append(str(line['objURL']))        except KeyError:            break            # after_url.append(str(line['objURL']))    url_list = []    for source, after in zip(source_url, after_url):        url_list.append([source, after])    return url_list


观察真实地址和加密地址,可以很容易获得符号的映射关系

code_dict={}code_dict['_z&e3B']='.'code_dict['AzdH3F']='/'code_dict['_z2C$q']=':'

制作一个替换函数,将加密字符串中的符号恢复

def changecode_url(text, trans_dict):    trans_dict = {re.escape(key):value for key,value in trans_dict.items()}    pattern = re.compile('|'.join(trans_dict.keys()))    text = pattern.sub(lambda m: trans_dict[re.escape(m.group(0))], text)    return text


恢复后的字符串与真实地址字符串依次对比,制作字符的对应关系

def extract_dict(url_list=url_list,trans_dict = trans_dict):    # url_list每个元素的第一个为原链接,第二个为混淆链接    for url in url_list:        url[1]=changecode_url(url[1], code_dict)  # 去掉特殊符号        for key,value in zip(url[1], url[0]):            trans_dict[key] = value

通过对比30组地址,获得了一个覆盖大部分字符映射关系的字典。之后进行下载中对下载失败的地址进行检查,补充映射关系。







0 0
原创粉丝点击