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 19:27:24 浏览: 81
这段代码实现了一个简单的图片爬虫,能够从一个图片网站上抓取图片并下载到本地。
首先,在代码的开头导入了需要用到的模块,包括`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`模块来进行进程池并发下载,可以同时下载多个图片,提高了下载速度。
阅读全文