多线程下载图片
参考链接:
- Python标准库—urllib和urllib3
- urllib实战2–urllib基础urlretrieve()、urlcleanup()、info()、getcode()、geturl()的应用
- Python批量下载今日头条街拍美图
展示
Python 多线程下载图片~
python简单爬虫练习,python版本3.7,全部用标准库实现,线程池使用concurrend的ThreadPoolExecutor,下载库使用urllib
创建文件夹函数
def CrePath():
if not os.path.exists(fn):
os.mkdir(fn)
python-pyinstaller打包后对获取路径的修复方法:
参考连接:python-pyinstaller、打包后获取路径
fn = f'{os.path.dirname(os.path.realpath(sys.argv[0]))}/{folder}'
CrePath()
多线程主体结构
from concurrent.futures import ThreadPoolExecutor
def main(page_num):
datas = get_page(page_num)
for link in get_images(datas):
done = pool.submit(saving_img, link)
done.add_done_callback(huitiao)
if __name__ == '__main__':
# 设置5个线程
pool = ThreadPoolExecutor(5)
# 遍历获取下载link,并添加到线程池
for page_num in range(0, 2):
main(page_num)
pool.shutdown(wait=True)
获取数据函数
def get_page(page_num):
params = {
...
}
url = 'https://so.toutiao.com/search?' + parse.urlencode(params)
try:
req = request.Request(url, headers=headers)
resp = request.urlopen(req)
if resp.getcode() == 200:
return resp.read().decode()
except error.HTTPError as e:
print('出错了:' + e.code)
return None
处理获取到的数据
此处的yield,使函数变为了生成器,这块知识,有必要课外补习一下,是python的特点之一~
def get_images(datas):
# 可以对获取到的数据先存起来,模拟处理一次
# with open("E:\\Codes\\python\\jiepai_datas.txt",
# mode='r',
# encoding='utf-8') as f:
# images = json.loads(f.read()).get('rawData').get('data')
images = json.loads(datas).get('rawData').get('data')
for image in images:
link = image.get('img_url')
yield link
下载图片
这边使用urllib.urlretrieve()下载链接到本地路径
注意:
这次的例子,下载图片比较简单, 不需带referer参数,如果需要带参数,暂时还是建议使用request会较简单。因为在这个urllib函数这里不知道如何带header、referer等参数请求。
def saving_img(link):
request.urlretrieve(link, fn + f'/jiepai-{name}.jpg')
绑定的回调函数
注意
:回调函数必须要带一个对象参数future
def huitiao(future):
global name
print(f'-------正在打印第{name}张图片')
name += 1