这段代码是一个简单的爬虫脚本,用于从网页上下载故宫壁纸图片。它使用了多线程池来提高图片下载的效率。
主要功能:
- 导入所需的库和模块,包括
time
、os
、requests
、lxml
、multiprocessing.dummy
(多线程池)。 - 定义了一个全局变量
count
,用于给下载的图片文件编号。 - 创建一个函数
get_img_urls(url)
,用于从指定的 URL 中获取图片的链接,并创建一个多线程池来并发下载图片。
- 使用
requests
获取网页内容。 - 使用
etree
解析 HTML 内容。 - 从解析后的 HTML 中提取图片的标题和链接。
- 创建一个多线程池,每个线程调用
down_load
函数进行图片下载。
- 创建另一个函数
down_load(name, url)
,用于实际下载图片文件。
- 使用
requests
获取图片内容。 - 在指定的文件夹路径下保存下载的图片,文件名以
count
编号和图片标题命名。 - 递增全局变量
count
。 - 为了避免频繁下载,每下载一个图片后休眠 0.1 秒。
- 在
__main__
部分:
- 记录开始时间。
- 循环遍历 1 到 10 页,构建 URL,并调用
get_img_urls
函数下载每页的图片。 - 输出总下载时间。
这段代码通过多线程池并发下载图片,可以有效地提高下载速度。不过需要注意,多线程下载可能会对网站造成一定程度的压力,需要合理使用。另外,代码中使用了全局变量 count
来为下载的图片编号,这可能在多线程情况下会有竞争条件,你可以考虑使用锁机制来避免可能的问题。
import time
import os
import requests
from lxml import etree
from multiprocessing.dummy import Pool
headers = {
"Accept": "*/*",
"Referer": "https://www.dpm.org.cn/lights/royal.html",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
}
def get_img_urls(url):
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
# print(response.text)
html = etree.HTML(response.text)
imgs = html.xpath('//div[@class="pic"]/a/img')
multi_pool = Pool(16) # 创建16个线程池
for i in imgs:
title = i.xpath('./@title')[0]
src = i.xpath('./@src')[0]
multi_pool.apply_async(down_load, args=(title, src))
multi_pool.close()
multi_pool.join()
def down_load(name, url):
res = requests.get(url, headers=headers)
global count
path = './故宫壁纸' # 下载路径(当前文件夹下‘故宫壁纸’文件夹)
if not os.path.exists(path):
os.mkdir(path)
print(f'正在下载>>> {count}_{name}.jpg ...')
with open(f'{path}/{count}_{name}.jpg','wb') as f:
f.write(res.content)
print(f'图_{count} 下载完成!')
count += 1
time.sleep(0.1)
if __name__ == '__main__':
star_t = time.time()
count = 1
url = "https://www.dpm.org.cn/lights/royal/p/{}.html"
for page in range(1, 11): # 下载1-10页的图
get_img_urls(url.format(page))
print(f'All Done in {time.time()-star_t:.3f} seconds')
评论前必须登录!
注册