import os
import requests
from urllib.parse import urlencode
from hashlib import md5
from multiprocessing.pool import Pool
GROUP_START = 1
GROUP_END = 5
#得到网页源代码
def get_page(offset):
params = {
'offset': offset,
'format': 'json',
'keyword': '街拍',
'autoload': 'true',
'count': '20',
'cur_tab': '3',
'from': 'gallery',
}
url = 'https://www.toutiao.com/search_content/?' + urlencode(params)
try:
response = requests.get(url)
if response.status_code == 200:
return response.json()
except requests.ConnectionError:
return None
#得到图片
def get_images(json):
data = json.get('data')
if data:
for item in data:
# print(item)
image_list = item.get('image_list')
title = item.get('title')
# print(image_list)
if image_list:
for image in image_list:
yield {
'image': image.get('url'),
'title': title
}
#保存图片
def save_image(item):
if not os.path.exists(item.get('title')):
os.mkdir(item.get('title'))
try:
local_image_url = item.get('image')
new_image_url = local_image_url.replace('list','large')
response = requests.get('http:' + new_image_url)
if response.status_code == 200:
#MD5 图片的名称使用其美容的MD5值,这样可以去重
file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg')
if not os.path.exists(file_path):
with open(file_path, 'wb')as f:
f.write(response.content)
else:
print('Already Downloaded', file_path)
except requests.ConnectionError:
print('Failed to save image')
def main(offset):
json = get_page(offset)
for item in get_images(json):
print(item)
save_image(item)
if __name__ == '__main__':
GROUP_START = 0
GROUP_END = 21
pool = Pool() #多进程线程池
groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])
pool.map(main, groups) #实现多进程下载
pool.close()
pool.join()