爬取图片的基本思路
1.分析图片地址流程
图1:
2.下载图片流程
3. 需要准备的包
frome bs4 import BeautifulSoup #用于解析HTML标签的包,注意3.6版本的python要安装4.4以上的版本
import Request #用于url请求获取html回应包
import html5lib #
import urllib3 #
有了上述的分析,我们举3个例子,难度由易到难,进行演示.
实战(一)-简单的图片爬取
1. 得到带keyword的URL
举例: 网站1
假设输入搜索关键词”sad”,经过分析得到:主地址+keyword,【http://www.fotocommunity.com/photos/sad?】
2. 获取图片总页码
url = 'http://www.fotocommunity.com/photos/sad?'
res = request.get(url)
#html format
soup = BeautifulSoup(res.content, 'html5lib')
#find total pages num
filter = 'div.fcx-photos-container > div.container > div.row > div.col-xs-12.col-lg-4 > div > h1'
total_pages_num = soup.select(filter)[0].string.split('by')[1]
2. 获取每个page的URL
url = base_url + 'page=' + str(page+1)
res = requests.get(url)
img_url_list = re.findall('data-src="(.*?)"', res.text, re.S)
3. 获取每张图片的URL,下载图片
for img_url in img_url_list:
img_data = requests.get(img_url)
img_count += 1
file_name = 'pic\\' + keyword + '\\' +cur_time +'_%d'%img_count
if not os.path.exists('pic\\' + keyword):
os.mkdir('pic\\' + keyword)
open('%s.jpg'%file_name,'wb').write(img_data.content)
print('已下载第 %d 张 图片...'%img_count)
实战(二)-构造json请求包的图片爬取
1. 得到带keyword的URL
举例: 网站2
【分析(瀑布流)】
在如下页面下,向下滑动鼠标,【Name】有新加入list的地址,点击一个查看【XHR】发现了主地址+一串字符
2. 构造Json字符串,下载图片
pn = currentpage * step
params = {
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': keyword,#搜索关键词
'cl': 2,
'lm': '',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': 0,
'word': keyword, #搜索关键词
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': 1,
'istype': 2,
'qc': '',
'nc': 1,
'fr': '',
'pn': pn, #当前滑动到的位置
'rn': step, #每次显示30附图
'gsm': str(hex(pn))[2: ].upper(),
'1504664546883': ''
}
# http 池管理
http = urllib3.PoolManager()
# 模拟浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
}
resp = http.request(method='GET', url=weburl, fields=params, headers=headers)
# 格式化一下json串,减少解析失败次数
respdata = invalid_escape.sub('', resp.data.decode('utf-8')).replace('\\','')
jsondata = json.loads(respdata)
datalist = jsondata.get('data')
for data in datalist:
url = data.get('thumbURL')
downloadList.append(url)
实战(三)-模拟浏览器的图片爬取
总结
参考文章及格式化工具
1.【图文详解】python爬虫实战——5分钟做个图片自动下载器
2.JS/HTML格式化
3.Python 正则re模块之compile()和findall()详解
4.python中的try/except/else/finally语句
5.URL中“#” “?” &“”号的作用
6.Python爬虫利器二之Beautiful Soup的用法