所谓动态加载图片即指html刚加载时,图片时没有的,然后通过json发生有关图片的数据,在插入到html里面去,以到底快速打开网页的目的,那么问题来了?我们如何找到加载文件的json文件呢?而这个问题正是我们实现爬取百度图片的第一步,让小可爱告诉你怎么做吧。
我们以表情包这个关键字为例,如下图
小可爱在百度图片搜索表情包来到上图页面,然后按F12来到开发者页面,
我们点击二个json文件 如:
②https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E8%A1%A8%E6%83%85%E5%8C%85&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E8%A1%A8%E6%83%85%E5%8C%85&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=60&rn=30&gsm=3c&1523454876394=
两个链接的第一处和第二处标红处为关键字word的编码格式,可以用urllib.parse.unquote()解码,第二个为每次涮新的步长,计算为rm+上一个pn
我们在看看链接的内容吧
这里你只要记住我们要找的图片链接为objURL就行,可以通过re模块compile与find_all方法找出这个json文件的所有objurl,有了这些objurl,到了这里我们就离成功爬取百度图片不远了。ps由于百度图片的objurl加密了,所以解密过程就不解释了。
接着小可爱便附上我们的完整代码
import json import itertools import urllib import requests import os import re import sys word=input("请输入关键字:") path="F:/maps" if not os.path.exists(path): os.mkdir(path) word=urllib.parse.quote(word) #该URL地址不是网页的URL地址,而JSON地址 url = r"http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&fp=result&queryWord={word}&cl=2&lm=-1&ie=utf-8&oe=utf-8&st=-1&ic=0&word={word}&face=0&istype=2nc=1&pn={pn}&rn=60" urls=[url.format(word=word,pn=x*60)for x in range(0,100)] index=0 str_table = { '_z2C$q': ':', '_z&e3B': '.', 'AzdH3F': '/' } char_table = { 'w': 'a', 'k': 'b', 'v': 'c', '1': 'd', 'j': 'e', 'u': 'f', '2': 'g', 'i': 'h', 't': 'i', '3': 'j', 'h': 'k', 's': 'l', '4': 'm', 'g': 'n', '5': 'o', 'r': 'p', 'q': 'q', '6': 'r', 'f': 's', 'p': 't', '7': 'u', 'e': 'v', 'o': 'w', '8': '1', 'd': '2', 'n': '3', '9': '4', 'c': '5', 'm': '6', '0': '7', 'b': '8', 'l': '9', 'a': '0' } i=1 char_table = {ord(key): ord(value) for key, value in char_table.items()} for url in urls: html=requests.get(url,timeout=10).text #设置编译格式 a=re.compile(r'"objURL":"(.*?)"') downURL=re.findall(a,html) for t in downURL: #解码 for key, value in str_table.items(): t = t.replace(key, value) t=t.translate(char_table) try: html_1=requests.get(t) if str(html_1.status_code)[0]=="4": print('失败1') continue except Exception as e: print('失败2') continue #下载 with open(path+"/"+str(i)+".jpg",'wb') as f: f.write(html_1.content) i=i+1
下面两个分别是小可爱自己原创编写的爬取蜂鸟网和汇图网的爬虫代码,
汇图网爬虫;
import re import requests import os import urllib header= {'content-type': 'application/json', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} url="http://soso.huitu.com/Search/GetAllPicInfo?perPageSize=102&kw={word}&page={num}" word=input("请输入关键字:") word=urllib.parse.quote(word) urls=[str(url).format(word=word,num=x)for x in range(1,2)] i=1 for url in urls: print(url) html=requests.get(url).text print(html) r=re.compile(r'"imgUrl":"(.*?)"') u=re.findall(r,html) for s in u: htmls=requests.get(s) with open("F:\\im\\"+str(i)+".jpg",'wb')as f: f.write(htmls.content) i=i+1
蜂鸟网爬虫:
import re import requests import os import itertools url="http://photo.fengniao.com/ajaxPhoto.php?action=getPhotoLists&fid=595&sort=0&page={num}" i=1 path="F:\\fengniao" if not os.path.exists(path): os.mkdir(path) urls = [url.format(num=x) for x in range(1,100)] for url in urls: html = requests.get(url).text r=re.compile(r'"image":"(.*?)"') u=re.findall(r, html) for downurl in u: downurl=str(downurl).replace("\\","").split("?")[0] htmls=requests.get(downurl) with open(path+"\\"+str(i)+".jpg",'wb') as f: f.write(htmls.content) i=i+1 print(downurl)
原文地址:http://blog.51cto.com/11623741/2097160