import os.path import random import time from multiprocessing import Pool import requests from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36' } def get_img_src(page): ''' 抓取页面的图片的src :return: ''' for i in range(1, page+1): url = f'https://www.pkdoutu.com/photo/list/?page={i}' print(f'抓取{url}页数据') res = requests.get(url, headers=headers) res.encoding = res.apparent_encoding tree = etree.HTML(res.text) # 抓取图片 img_list = tree.xpath('//img[@referrerpolicy="no-referrer"]/@data-original') yield img_list def download_img(url): ''' 下载图片 :return: ''' time.sleep(random.uniform(0, 1)) img_res = requests.get(url, headers=headers) img_name = url.split('_')[-1] # 通过图片url进行拆分,拿到图片名称和后缀 path = 'img' # 判断路径是否存在,不存在则创建 if not os.path.exists(path): os.mkdir(path) # 写入到文件中 with open(os.path.join(path, img_name), 'wb') as f: f.write(img_res.content) if __name__ == '__main__': pool = Pool() # 通过生成器get_img_src返回图片列表 for url_list in get_img_src(2): for url in url_list: # 循环加入进程池 pool.apply_async(download_img, args=(url, )) pool.close() pool.join() print('over')
时间: 2024-04-25 09:27:17 浏览: 14
这是一个 Python 程序,主要用于从指定网站上抓取图片并下载到本地。程序使用了 multiprocessing 库中的进程池来实现多进程下载,加快了下载速度。其中,get_img_src 函数用于抓取指定页数的图片链接,download_img 函数用于下载指定链接的图片并保存到本地。主函数中使用了进程池来异步下载所有图片。
程序的具体实现步骤如下:
1. 导入所需的库,包括 os.path、random、time、multiprocessing 和 requests。
2. 定义抓取图片链接的函数 get_img_src,通过循环抓取指定页数的页面,并使用 lxml 库解析页面内容,抓取图片链接并返回。
3. 定义下载图片的函数 download_img,通过 requests 库下载指定链接的图片,并将图片保存到本地。
4. 在主函数中使用进程池来异步下载所有图片,具体实现如下:
a. 创建进程池 pool。
b. 通过生成器 get_img_src 返回图片链接列表,循环遍历每个链接。
c. 将 download_img 函数加入进程池,并传入图片链接作为参数。
d. 关闭进程池,并等待所有进程完成。
e. 打印下载完成提示信息。
该程序适用于需要大量下载图片的场景,可以通过调整进程池的大小和抓取的页数来适应不同的需求。
相关问题
import os.path import random import time from multiprocessing import Pool import requests from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36' } def get_img_src(page): ''' 抓取页面的图片的src :return: ''' for i in range(1, page+1): url = f'https://www.pkdoutu.com/photo/list/?page={i}' print(f'抓取{url}页数据') res = requests.get(url, headers=headers) res.encoding = res.apparent_encoding tree = etree.HTML(res.text) # 抓取图片 img_list = tree.xpath('//img[@referrerpolicy="no-referrer"]/@data-original') yield img_list def download_img(url): ''' 下载图片 :return: ''' time.sleep(random.uniform(0, 1)) img_res = requests.get(url, headers=headers) img_name = url.split('_')[-1] # 通过图片url进行拆分,拿到图片名称和后缀 path = 'img' # 判断路径是否存在,不存在则创建 if not os.path.exists(path): os.mkdir(path) # 写入到文件中 with open(os.path.join(path, img_name), 'wb') as f: f.write(img_res.content) if __name__ == '__main__': pool = Pool() # 通过生成器get_img_src返回图片列表 for url_list in get_img_src(2): for url in url_list: # 循环加入进程池 pool.apply_async(download_img, args=(url, )) pool.close() pool.join() print('over') 这段代码请详细讲解
这段代码实现了一个简单的图片爬虫,能够从一个图片网站上抓取图片并下载到本地。
首先,在代码的开头导入了需要用到的模块,包括`os.path`、`random`、`time`、`multiprocessing`、`requests`和`lxml.etree`。其中,`os.path`模块提供了一些常用的函数来处理文件和目录路径,`random`模块用来生成随机数,`time`模块用来控制爬虫的访问速度,`multiprocessing`模块用来进行进程池并发下载,`requests`模块用来实现网络请求,`lxml.etree`模块用来解析HTML文档。
接着,定义了两个函数`get_img_src`和`download_img`。
`get_img_src`函数用来抓取页面的图片的src。它使用了一个`for`循环来遍历每一页,通过`requests`模块发送HTTP请求获取页面的HTML文档,然后使用`lxml.etree`模块解析HTML文档,抓取所有图片的src。最后,通过`yield`关键字返回图片的src列表。
`download_img`函数用来下载图片。它接收一个图片的URL作为参数,使用`requests`模块发送HTTP请求获取图片的二进制数据,然后使用`os.path`模块判断存储图片的文件夹是否存在,如果不存在就创建文件夹,然后将图片的二进制数据写入到本地文件中。
在主函数中,首先创建了一个进程池`pool`,然后通过调用`get_img_src`函数返回图片的src列表。然后,使用两个`for`循环依次遍历每个图片的URL,将其作为参数传递给`pool.apply_async`方法,将下载图片的任务加入到进程池中。最后,调用`pool.close()`方法关闭进程池,调用`pool.join()`方法等待所有任务完成,最终输出执行结束的提示信息。
需要注意的是,在下载图片时,为了避免对网站服务器造成过大的负担,使用了`time`模块生成了一个随机数来控制爬虫的访问速度。同时,为了提高爬虫的效率,使用了`multiprocessing`模块来进行进程池并发下载,可以同时下载多个图片,提高了下载速度。
解释代码importjson importos importtime frommultiprocessingimportPool,cpu_count fromdatetimeimporttimedelta frompydubimportAudioSegment
这段代码的作用是导入了以下几个Python库:
- `json`:用于处理JSON格式的数据。
- `os`:提供了许多与操作系统交互的函数。
- `time`:提供了处理时间的函数。
- `multiprocessing`:提供了多进程编程的支持。
- `Pool` 和 `cpu_count`:用于创建进程池和获取CPU核心数量。
- `timedelta`:用于处理时间差。
- `AudioSegment`:用于处理音频文件的库。