前言
要求:进行搜索并且保存360图库图片
图库地址:360图库
基本思路
简单分析以后,发现360图库使用动态渲染,并且采用下拉反式加载图片,那么解决问题就出现3种常用方法,操作js、模拟浏览器、Ajax。如果使用模拟的反式代码量较高,速度慢(当然也更加稳定),但是经过简单分析以后发现图片是使用ajax加载的。那么就直接使用ajax。
分析该请求
查看请求的response
发现请求的结果是一个json字符串,并且在字符串中找到了"img":“http://image2.sina.com.cn/ty/k/2007-02-28/U1830P6T12D2772429F44DT20070228124853.jpg”,这样一个字段,这不就是要爬取的图片地址吗。
那么问题就简单了,我们可以通过requsets模拟请求后,直接解析json提取图片地址,保存就完成工作了。
我们分析请求头有
这样几个重要字段
q:搜索关键词
ps-sn:爬取图片的标记(每次增加60)
pn:爬取图片的页数
简单分析以后就开始写代码
import requests
from urllib.request import urlretrieve
import timedef image_spider(key_q, key_ps, key_sn): # 请求函数url = "http://image.so.com/j?q=nba&src=srp&correct=nba&pn=60&ch=&sn=208&ps=201&pc=60&pd=1&prevsn=148" \"&sid=39b8dabeae51031efce5a8d8b1fc6957&ran=0&ras=6&cn=0&gn=0&kn=8&comm=1"headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",'Referer': "http://image.so.com/i?q=nba&src=srp"}params = {'q': key_q,'src': 'srp','pn': '60','ch': '','sn': key_sn,'ps': key_ps,'pc': '60','pd': '1','prevsn': '0','sid': 'd34ad660320d853f00ea2d476ba2eaa5','ran': '0','ras': '6','cn': '0','gn': '0','kn': '8','comm': '1'}response = requests.get(url, headers=headers, params=params).json() # 转jsonlists = response.get('list') # 提取list件,值为一个列表for lis in lists:open_image(lis.get('img')) # 遍历列表,提取其中img字符串(图片url)time.sleep(2)def open_image(image_url):image_name = hash(image_url) # 图片名字(为图片地址的url值)path = 'image/%s.jpg' % str(image_name) # 图片地址urlretrieve(image_url, path) # 保存图片print(image_url, '下载成功')time.sleep(1)def main():key_q = input("输入要爬取的图片关键词")ps = 81sn = 88for i in range(0, 10): # 爬取多少图片key_ps = ps+i*60key_sn = sn+i*60image_spider(key_q, key_ps, key_sn)if __name__ == '__main__':main()
总结
360图库爬虫并不困难,实际上只要认真分析ajax,和返回的json就可以找到结果。