这个实例是抓取今日头条街拍美图,然后将每组图片分文件夹下载的到本地并保存下来。
在抓取之前先要分析抓取逻辑:
首先在搜索框中输入街拍:
然后打开Preview查看Pesponse Body,在搜索框中查找:车控街拍车之一定有些情怀系列,发现并没有找到:
说明这些数据是由Ajax加载然后通过Javascript渲染出来的,然后打开XHR过滤选项卡:
打开data:
发现title字段对应的数据正好是第一条数据。而每条数据都有一个large_image_url字段:
因此我们只需要将url提取出来并下载下来。在提取之前,我们还需要分析url的规律:
我们发现url有offset、count等参数,因此需要找出这些参数的规律,接下来滑动页面多加载一些数据:
发现只有offset变了,因此可以写出下面的代码:
import requests
from urllib.parse import urlencode
#加载单个Ajax请求
def get_page(offset):
params = {
'offset':offset,
'format':'json',
'keyword':'街拍',
'autoload':'true',
'count':'20',
'cur_tab':'1',
'from':'search',
'pd':'synthesis'
}
url = 'https://www.toutiao.com/search_content/?'+urlencode(params)#urlencode()方法用于构造请求的GET参数
try:
response = requests.get(url)
if response.status_code == 200:
return response.json()
except requests.ConnectionError:
return None
"""解析方法用于提取每条数据的image_url字段中的每一张图片链接,
将图片链接和图片所属的标题一并返回
"""
def get_images(json):
Img = []
Title = []
if json.get('data'):
for item in json.get('data'):
title = item.get('title')
Title.append(title)
images = item.get('large_image_url')
Img.append(images)
return Title,Img
'''
保存图片的方法,参数item是get_images()方法返回的字典
'''
def save_image(title,imag):
try:
response = requests.get(imag)#请求图片链接
if response.status_code == 200:
try:
file_path = '图片/{0}.{1}'.format(title,'jpg')
with open(file_path, 'wb') as f:
f.write(response.content) # 将图片的二进制数据写入文件
except OSError:
pass
else:
print('下载完毕',file_path)
except requests.ConnectionError:
print('保存图片失败')
def main(offset):
json = get_page(offset)
title,img = get_images(json)
for i in range(len(title)):
if title[i] != None and img[i] != '':
save_image(title[i],img[i])
GROUP_START = 1
GROUP_END = 20
if __name__ == '__main__':
groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]
for group in groups:
main(group)