以爬取搜狗图片为例,网页特点:采用“瀑布流”的方式加载图片,图片的真实地址存放在XHR中
1 #-*-coding:utf8-*- 2 import requests 3 import urllib 4 import json 5 import math 6 import os 7 8 class SG: 9 def __init__(self,pic_num): 10 self.num = pic_num 11 self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/61.0' #请求头属性(模拟浏览器访问) 12 self.headers = {'User-Agent' : self.user_agent} 13 14 def get_img(self): 15 end = int(math.ceil(float(self.num)/48)) 16 #print end 17 name = 1 18 #获取图片真实地址并保存到本地文件夹 19 for start in range (0,end): 20 url = 'http://pic.sogou.com/pics?query=%B1%DA%D6%BD&mode=1&dm=4&cwidth=1920&cheight=1080&start='+str(start)+'&reqType=ajax&reqFrom=result&tn=0' 21 imgs = requests.get(url,params=self.headers) 22 #print imgs 23 #搜狗图片真实地址存放在XHR中,访问发现是json文件,故解析json文件 24 jd = json.loads(imgs.text) 25 jd = jd['items'] #所有图片的信息都存在item数组中 26 imgs_url = [] 27 for j in jd: 28 if "=" not in j['pic_url']: #图片真实地址则存放在item元素中pic_url中 29 imgs_url.append(j['pic_url']) 30 else: 31 print j['pic_url'] 32 #print len(imgs_url) 33 34 for img_url in imgs_url: 35 #新建文件夹 36 if not os.path.exists('picture'): 37 os.makedirs('picture') 38 print img_url 39 40 #保存图片到本地文件夹 41 print('**********'+str(name)+'_1.jpg*********'+' Downloading') 42 #方法1 43 urllib.urlretrieve(img_url,'picture\'+str(name)+'_1.jpg') 44 45 print('**********'+str(name)+'_2.jpg*********'+' Downloading') 46 #方法2 'wb'以二进制方式写数据 47 with open('picture\'+str(name)+'_2.jpg','wb') as f: 48 f.write(requests.get(img_url,params=self.headers,allow_redirects=False).content) 49 50 name += 1 51 52 print('Download complete!') 53 54 SG(100).get_img() 55 56
使用方法二时,如果使用参数allow_redirects=False,容易导致下载内容为空的情况;如果不使用该参数(默认是True),则容易导致页面重定向过多的错误。具体使用时,根据情况选择是否使用