一个将多线程多进程结合爬取图片网站的示例

news/2024/5/9 4:27:34/文章来源:https://blog.csdn.net/qq_43544005/article/details/104493169

在图片网站爬取图片时候,我们需要取得具体每张图片的url地址,然后下载到电脑保存下来。这其中,对时间消耗最多的步骤是保存图片到本地硬盘,机械硬盘的读写性能速度较慢。如果采取单线程单进程的话,在读写的同时没法进行其他的操作,只能等待,浪费了性能。
对单个存有图片的页面而言,如果可以采取多线程的话,在写入图片的同时还能去请求新的图片地址保存到列表将会更合理的利用时间。因为图片网站,图片存放在很多页面里,所以对多个存有图片的页面而言采取 多进程,同时对多个有图片的页面进行爬取任务。
至于你要爬取什么样的图片网站, 我不得而知,不同网站展示图片界面不同或许与我的有差异但主体思路就这样。

接下来上代码:

import requests ,time,threading
from  lxml.html import etree
from  fake_useragent import UserAgent
from multiprocessing import Pool#得到自己爬取页网址
def get_Url(P):Url='保密'.format(P)return Url
#得到10个尤物的名字
def get_names(Url):all_names=[]header = {'User-Agent': UserAgent().chrome}response = requests.get(url=Url, headers=header)response.encoding = 'GB18030'e = etree.HTML(response.text)picture_name = e.xpath('//h2/a')for k in range(10):all_names.append(picture_name[k].text)return all_names
#得到第i个尤物的名字 i 0 9
def get_i_name(all_names,i):i_name=all_names[i]return i_name#得到10个尤物的首网址
def get_url(Url):all_urls=[]header = {'User-Agent' : UserAgent().chrome}response=requests.get(url=Url,headers=header)response.encoding='GB18030'e=etree.HTML(response.text)url=e.xpath('//h2//@href')for k in range(10):new_url = 'https://qqr57.com' + url[k]all_urls.append(new_url)return all_urls
#得到第i个尤物的首地址
def get_i_url(all_urls,i):i_url=all_urls[i]return i_url
#得到第i个尤物存在图片的地址
def i_girl_pictures_urls(i_url):mod_page_urls=[]header = {'User-Agent': UserAgent().chrome}response = requests.get(url=i_url, headers=header)response.encoding = 'GB18030'e = etree.HTML(response.text)next_page = (e.xpath('//li[@class="next-page"]/a'))[0].textj = 1#空列表=falsewhile next_page  :j = j + 1last_page = i_url.replace('.html', '_' + str(j) + '.html')new_new_url = last_pageheader = {'User-Agent': UserAgent().chrome}response = requests.get(url=new_new_url, headers=header)response.encoding = 'GB18030'e = etree.HTML(response.text)#     # time.sleep(0.05)next_page = (e.xpath('//li[@class="next-page"]/a'))# print(next_page)mod_page_urls.append(new_new_url)mod_page_urls.append(i_url)return mod_page_urls#得到第i尤物所有图片地址
def girl_jpg_urls(mod_page_urls):girl_pictures_urls=[]for a in range(len(mod_page_urls)):# 一只尤物某一个网页的图片链接地址time.sleep(0.1)girl_urls = mod_page_urls[a]# 一只尤物的所有图片地址header = {'User-Agent': UserAgent().chrome}response = requests.get(url=girl_urls, headers=header)response.encoding = 'GB18030'e = etree.HTML(response.text)girl_pictures_url = (e.xpath('//article[@class="article-content"]/p/img/@src'))girl_pictures_urls+=(girl_pictures_url)print(girl_pictures_urls)return girl_pictures_urls#根据所有图片地址 下载第i个尤物的图片
def save_imgs(girl_pictures_urls,i_name):x = len(girl_pictures_urls)for b in range(x):r = requests.get(url=girl_pictures_urls[b])time.sleep(0.2)print("正在爬取尤物" + i_name + str(b) + '进度:' + str(100 * (b + 1) / x) + '%')with open('保密/{}.jpg'.format(i_name + str(b)), 'wb') as f:f.write(r.content)#多线程下载单页的所有图片
def thread(P):threads = []Url=get_Url(P)all_names=get_names(Url)all_urls=get_url(Url)for i in range(10):i_name = get_i_name(all_names, i)i_url = get_i_url(all_urls, i)mod_page_urls = i_girl_pictures_urls(i_url)girl_pictures_urls = girl_jpg_urls(mod_page_urls)# save_imgs(girl_pictures_urls,i_name)t = threading.Thread(target=save_imgs,args=(girl_pictures_urls,i_name))threads.append(t)for i in threads:i.start()for i in threads:i.join()
#多进程请求不同的页面
def process(P):pool = Pool(processes=4) #定义一个进程池,最大进程数为4,默认大小为CPU核数for i in range(P):pool.apply_async(func=thread, args=(i,))pool.close()pool.join()# 主程序
if __name__ == '__main__':P=int(input('输入爬取的页面数量:'))start=time.time()process(P)end=time.time()print(str(end-start))

上效果图:
在这里插入图片描述
共有634张图片,
在这里插入图片描述
用时701秒,
在这里插入图片描述
单张图片用时约1.1秒
速度比较慢。这是因为,我只爬取得一个页面做了个示范,只体现出了多线程优势,多进程的优势没有体现出来。

再来一个示范:
在这里插入图片描述
这次我爬取了2694张图片 ,用时895秒,单张图片用时约0.3秒。因为我这次爬取的页数为4,CPU核数也为4,多进程的优势正好可以利用起来。
当页面数越多,图片数越多,节省的时间也越多。看着数据不断爬取下来的过程,很舒服啊
在这里插入图片描述
最终我一共爬取了4万多张图片。用时没统计,感觉不到 半小时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_877704.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将代码提交到github的两种方式(其他项目管理网站类似)

首先先去git官网下载git,现在就去. 下载完成之后,右键git bash 使用命令行配置你的git的用户名和邮箱,因为git是分布式系统,所以每个用户都是独立的 命令行输入: git config --global user.name "Your Name"git config --global user.email "emailexample.com…

​​​资源分享 | 一、盘点高清壁纸网站​​

​​​资源分享 | 一、盘点高清壁纸网站​​​​​​​​​​ ​​1. wallroom​​ ​​​​2. 极简壁纸​​​ ​​​​3. 高清壁纸库​​ ​​​​4. 动漫图片和壁纸​​ ​​​​5. Wallpaper Abyss​​​​ 资源分享 | 一、盘点无版权图片网站 作者:1024导…

微信开放平台申请网站应用

前言: 这是一篇我想严重吐槽的文章,我需要做一个微信扫码功能,我看了下文档,发现没有那么难,结果一开始我就卡壳,申请网站应用我申请了四次,我很奔溃,关键是我搞不懂的是为什么审核…

让你的网站应用加上微信扫码功能

前言: 继上篇文章在微信开放平台申请网站应用以后,我们就可以正式开始做微信扫码登录这个功能了,接下来这篇文章我将用最通俗易懂的话语让大家掌握整个微信扫码开发的流程,其实真的很简单,只要认真阅读官方文档,一步步…

python3.2 自动登录网站

让我帮写个小程序,查了查资料,用python写了一个,以前没用过,都是现查的资料,比较粗糙,放到这里留作备用。 1 import urllib.parse 2 import urllib.request 3 4 # ------------------------------需…

Python 自动登录网站(处理Cookie)

Python 自动登录网站(处理Cookie) 博客分类: Python Python代码 def login(): cj cookielib.CookieJar() opener urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) login_url rhttp://zhixing.bjtu.edu.cn/memb…

Python 最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表。 实现方式: 通过goog

Python 最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表。 实现方式: 通过google一搜,实现的方式大概有下面这篇文…

wordpress搜索引擎蜘蛛统计插件SEO

索引擎蜘蛛统计插件可以实时对搜索引擎来访进行统计,指导站长的运营,来访的蜘蛛类型和访问的页面都能在后台一目了然! 免费使用下载https://yomeiyo.lanzouw.com/ifh5300s4p7a安装即可 插件安装方法 上传压缩包安装插件 如果是付费插件的话…

用Django建一个网站

目标:用最短的步骤在本机创建一个网站。 第一步 安装好Django之后,在放置网页的目录下打开命令行,输入 django-admin startproject mysite 即可自动创建一个名为mysite的文件夹。 进入mysite文件夹,创建第一个web程序app01(任意):…

提升大型网站并发访问性能

应用服务器 网络应用 中国电信 Linux配置管理 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单。随着互联网业务的不断丰…

requests 正则表达正式基础爬虫案例二:爬取网站数据

要求:爬取https://ssr1.scrape.center/ 网站中所有电影标题、类型、地区、电影时长、上映日期、评分、简介; 分析:网站共有两个页面组成,电影列表和详情,我们所需要的内容都在详情页面里面可以找到。 列表页面共10页&a…

PC端网站 rem适配方案

以1920设计稿为准 1、使用sass语法 转换px rem , vscode编辑器安装插件easy-scss 安装之后打开插件setting.json, 在setting.json里配置转换后css的路径 “easysass.targetDir”: “./css” 创建css文件、scss文件: 项目中如何使用index.sc…

给大家分享下织梦网站模板

最近需要用到一个官网模板,作为一个后台程序员来说写前端和专业的差了远了,所以想找个模板学习下,可是我这面是一顿搜一顿找找了好多都快绝望了因为都不是免费下载的不过最终还是找到了,在这里分享给大家 模板一 红色大气响应式重…

网站案例,成功案例--我的个人作品

西南贝思建筑图书连锁店网上书店成都美可快餐诚信促进会 成都商务投资网中国西部土工材料网广东劳斯丹顿卫浴设备有限公司盛世外贸服装批发城西南时报成都免费网站中国检察网成都乐于健康护理成都顺世文化传播有限公司西南大学生联盟成都川国味餐饮有限公司成都市科技进修学院…

vue 微软插件实现根据第三方网站链接预览word、pd、excelf等文件

一开始做的时候没想到会预览不了,报错 File not found The URL of the original file is not valid or the document is not publicly accessible. Verify the URL is correct, then contact the document owner.如下: 我在微软官网查到: 官…

世界第五大外包公司(CGI group inc)能够做出来多烂的网站,通过系分的课程设计我对于人机交互和团队合作的几个总结

文章目录 前情提要为开始刨祖坟模式做准备CGI inc发家史什么是外包公司CGI group inc看看CGI公司外包的网站你以为CGI做的网站这就算差了?听说你想自己改成好记的密码,想多了吧信息填写一次过,听说你想写到一半保存?我是随便的人吗…

小型网站到大型网站的演化过程

本文摘自书籍《大型网站技术架构.核心原理与案例分析》 1. 初始阶段: 应用程序、数据库、文件等所有资源都在一台服务器上。 2. 应用服务与数据服务分离 应用和数据分离后整个网站使用三台服务器:应用服务器、文件服务器和数据库服务器。这三台服务器对…

python爬取唯品会电商网站数据并保存到csv中

文章目录 1.目标、思路2. 获取数据3.解析数据4.保存数据 1.目标、思路 目标: 本次爬虫爬取的目标是唯品会中口红分类的商品。(url ) 思路:打开网页后点击F12打开抓包工具,找到我们想要的数据包,并分析。 …

各大视频网站下载神器

先说介绍工具,后说使用方法(其实不难) you-get 是GitHub上的一个项目,其实就是通过几个命令行下载各大网站视频的,这对于做视频的爱好者及一些司机都是很奈斯的选择。 地址:https://github.com/soimort/y…

电子商务网站的 10 个易用性规则

电子商务网站的 10 个易用性规则 电子商务网站的竞争越来越激烈,虽然你可能在以最低的价格卖最好的东西,但同样重要的的是用户的购买体验,对电子商务网站而言,易用性就是让用户尽 可能快而简单的完成购买,有时候&…