【python】【爬虫】妖精的爬虫学习之路——用requests下载百度图片
import requests
import os
def getPages(keyword,pages):
params = []
for i in range(0, pages*30 + 30, 30):
params.append({
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': keyword,
'cl': 2,
'lm': -1,
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': '',
'hd': '',
'latest': '',
'copyright':'',
'word': keyword,
's':'',
'se':'',
'tab':'',
'width':'',
'height':'',
'face': 0,
'istype': 2,
'qc':'',
'nc': 1,
'fr':'',
'expermode':'',
'force':'',
'pn': i,
'rn': 30,
'gsm': '3c',
'1554124009275':''
})
url = 'https://image.baidu.com/search/acjson'
urls = []
for i in params:
urls.append(requests.get(url,params = i).json().get('data'))
return urls
def getImages(urls):
if not os.path.exists("陈钰琪妹纸"):
os.mkdir("陈钰琪妹纸")
x = 0
for list in urls:
for i in list:
if i.get('middleURL') != None:
print("downloading: %s" % i.get('middleURL'))
ir = requests.get(i.get('middleURL'))
open("./陈钰琪妹纸/" + '%d.jpg' % x, 'wb').write(ir.content)
x += 1
else:
print('error')
getImages(getPages("陈钰琪 倚天屠龙记",10))
随便拿了最近很火的新版倚天来练手,示例中保存了300张百度图片搜索结果,因为网上教程纷繁,各有各的优点各有各的不足,这是最终我本人实验成功的最简单的版本。
Tips:
-
params
这个参数,里面用的是acjson
页面的请求头,因为百度图片下拉会加载新的json文件,每一页的不同在于pn
以30的速度增加,为了方便加载任意多的页面,所以使用 https://image.baidu.com/search/acjson 页面发送请求,params
自然也是对应页面的参数(上面pn
的i
和下面requests
的参数i不要混淆,上面的i是第一个for循环的,是页数,下面的i
是i in params
的,是一套参数)acjson
页面解析如下: -
使用
get “middleURL”
是因为我们获取的是.json().get('data')
在源码中app.setData
可以看到,每张图片有四个地址。分别是thumbURL
,middleURL
,hoverURL
,还有ObjURL
如下图:
(ps:这里的截图用的是把上面代码的print("downloading: %s" % i.get('middleURL'))
改为print("downloading: %s" % i)
,网页元素实在看的眼晕= =排好格式出来就好看多了)其中
thumbURL
middleURL
是百度图片上的图,相对middle
大一点,hoverURL
是鼠标移动过后显示的版本,ObjURL
是原始大图,可以看到后面还带了源地址。B U T! 这个ObjURL
,并不能直接访问,所以我们选择了下载百度图片的middleURL
-
写文件的那两
ir = requests.get(i.get(‘middleURL’))
open("./陈钰琪妹纸/" + ‘%d.jpg’ % x, ‘wb’).write(ir.content)ir.content 是图片的二进制形式,保存为图片格式可以直接转换成图片