美女图片的Python爬虫实例(二)服务器自用版

该爬虫面向成年人且有一定的自控能力(涉及部分性感图片,仅用于爬虫实例研究)

美女图片的Python爬虫实例(二)服务器自用版前言

初始教程

该教程面向服务器版本,为原始升级版

 

存在问题

  • 原始爬虫存在部分逻辑问题
  • 在笔记本上爬图片太浪费资源(网速、磁盘、内存+一部分CPU)
  • 在对该网站爬取过程出现远程主机关闭现有连接,需要手动重新爬取

 

解决思路

转向服务器,由服务器实现不间断爬虫

 

目标

  • 实现网页上所有图片均可爬取
  • 实现不间断爬取
  • 实现断网重连

 

代码实现

头部

由于解析中文有点问题,搜了下在头部加了个编码说明(1 ~ 4行)在(7 ~ 8)行是用于取消ssh链接后的红色警告,socket用于设置超时时间

初始配置

  • 参考【Python爬虫错误】ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接解决了:ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。')
  • 设置超时等待时间是60s,即60s后链接不上则取消连接
  • 参考python 爬虫:https; HTTPSConnectionPool(host=‘z.jd.com’, port=443)修改headers 用于修改链接方式减少链接数量,解决链接次数过多被远程主机拒绝连接
# 存储目录
dir = r"/volume2/Server/Study/Python/"
url = "https://www.xrmn5.com"

# 解决ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。
# 链接:
# 
# 设置超时时间
time_out = 60
socket.setdefaulttimeout(20*time_out)

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84',
	'Connection':'close'
}

URL = "https://www.xrmn5.com/XiuRen/"
WebURL = "https://www.xrmn5.com/"

 

获取首页及总共需爬取的写真专辑页数

这里根据警告对应链接https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings添加了requests.packages.urllib3.disable_warnings()用于去除添加ssh无认证下的红色警告而添加ssh无认证和超时时间在下面:用于解决链接次数过多无法连接问题
requests.get(URL,headers=headers,timeout=time_out,verify=False)

time.sleep(1)
# 去除添加ssh无认证下的红色警告
# https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
requests.packages.urllib3.disable_warnings()
Get_url = requests.get(URL,headers=headers,timeout=time_out,verify=False)
Get_url.encoding = 'utf-8'
Get_html = Get_url.text
# 关闭当前链接
Get_url.close()
# print(Get_html)

patrenForPageNum = '</a><a href="(.*?)">'
Get_PageNum = re.compile(patrenForPageNum,re.S).findall(Get_html)
temp = str(Get_PageNum[len(Get_PageNum)-1])
# 获取该网站共有多少页
PageNum = "".join(list(filter(str.isdigit, temp)))

# 获取所有网页,存入AllPage中
AllPageTemp = []
GetAllPage = ()
for i in range(int(PageNum)):
	if i > 0:
		AllPageTemp.append(WebURL+"/XiuRen/index"+str(i+1)+".html")
GetAllPage += tuple(AllPageTemp)
print(len(GetAllPage))

 

重点部分

变量说明

  • urls : 这是用于存储当前页的所有写真专辑信息,包括网页urls[i][0]、标题urls[i][1]和封面地址urls[i][2]
  • inforName:这里是存储当前页的所有写真专辑对应的人物信息,包括艺名inforName[i][0]和标题inforName[i][1]
  • likeNum:这里是用于存储当前页的所有写真专辑对应的创建时间likeNum[i][0]和查看次数likeNum[i][1]
  • getImgDir:专辑对应图片的本地保存地址
  • file_num:获取该专辑的所有图片数量xx,即(xxP)
  • imgUrl:专辑对应封面图片的下载网址
  • imgName:封面保存名称
  • IntoPageUrl:封面对应专辑的具体网页
  • Get_InPage:获取封面对应专辑的具体网页
  • Get_InPagehtml:获取封面对应专辑的具体网页的文本格式
  • AllPage:获取该封面对应专辑的所有网页链接AllPage[k][0]
  • imgPageUrl:获取当前页的图片链接
  • PageNum:获取当前页的图片数量
  • GetPageImg:当前页的图片完整链接url + imgPageUrl[l]
  • PageImgeName:当前页对应图片的存储路径getImgDir + imgPageUrl[l].split('/')[-1]
  • Get_PImg:由GetPageImg获取的对应网页二进制数据,即图片本体数据
  • NewPaperUrl:获取封面对应专辑的具体网页的下一页网页数据
  • Get_url:获取该网站下一页网页数据,再由urls来获取当前页的所有写真专辑信息
  • Get_html:获取该网站下一页网页的文本格式

 

实现说明

  • 通过判断当前目录的文件数len(os.listdir(getImgDir)与专辑对应图片数int(file_num[12:])),保证已下载的目录会被跳过,减少时间浪费
  • 通过 try ……except Exception as e的方式,在try中如果get网页不成功,将错误扔至except Exception,再试一次

 

代码实现

# 开始从首页获取
for pagenum in range(int(PageNum)):
	urls = re.findall('<li class="i_list list_n2"><a  href="(.*?)" alt=(.*?) title=.*?><img class="waitpic" src="(.*?)"', Get_html)
	patren1 = '<div class="postlist-imagenum"><span>(.*?)</span></div></a><div class="case_info"><div class="meta-title">[.*?](.*?)</a></div>'
	patren2 = '<div class="meta-post"><i class="fa fa-clock-o"></i>(.*?)<span class="cx_like"><i class="fa fa-eye"></i>(.*?)</span>'
	inforName = re.compile(patren1, re.S).findall(Get_html)
	likeNum = re.compile(patren2, re.S).findall(Get_html)
	print(urls)
	print(inforName)
	print(likeNum)
	num = len(likeNum)

	patren3 = '<img οnlοad=.*? alt=.*? title=.*? src="(.*?)" />'

	for i in range(num):
		if (int(likeNum[i][1]) > 500):
			getImgDir = dir + str(inforName[i][0]) + '/' + str(likeNum[i][0]) + '/' + str(inforName[i][1] + '/')
			file_num = "".join(list(filter(str.isdigit, getImgDir)))

			# 创建对应目录
			if not os.path.exists(getImgDir):
				os.makedirs(getImgDir)
			else:
				print("此目录已存在:",getImgDir)
				if (len(os.listdir(getImgDir)) >= (int(file_num[12:]))):
					continue
			imgUrl = url + urls[i][2]
			imgName = getImgDir + urls[i][2].split('/')[-1]
			print(imgUrl,imgName)

			# 获取封面图片
			if os.path.isfile(imgName):
				print("此封面已存在:", imgName)
			else:
				time.sleep(1)
				try:
					requests.packages.urllib3.disable_warnings()
					Get_Img = requests.get(imgUrl, headers=headers,timeout=time_out,verify=False)
					with open(imgName, 'wb') as f:
						f.write(Get_Img.content)
					Get_Img.close()
				except Exception as e:
					print('get the first img with the error:  %s ' % e)
					time.sleep(1)
					requests.packages.urllib3.disable_warnings()
					Get_Img = requests.get(imgUrl, headers=headers, timeout=time_out, verify=False)
					with open(imgName, 'wb') as f:
						f.write(Get_Img.content)
					Get_Img.close()
			# 进入具体网页
			IntoPageUrl = WebURL + urls[i][0]
			print("当前写真网页为:",IntoPageUrl)
			time.sleep(1)
			try:
				requests.packages.urllib3.disable_warnings()
				Get_InPage = requests.get(IntoPageUrl, headers=headers,timeout=time_out,verify=False)
				Get_InPage.encoding = 'utf-8'
				Get_InPagehtml = Get_InPage.text
				Get_InPage.close()
			except Exception as e:
				print('get the img page with the error:  %s ' % e)
				time.sleep(1)
				requests.packages.urllib3.disable_warnings()
				Get_InPage = requests.get(IntoPageUrl, headers=headers, timeout=time_out, verify=False)
				Get_InPage.encoding = 'utf-8'
				Get_InPagehtml = Get_InPage.text
				Get_InPage.close()

			AllPage = re.findall('</a><a href="(.*?)">([0-9]*)', Get_InPagehtml)

			for k in range(len(AllPage)):
				imgPageUrl = re.compile(patren3, re.S).findall(Get_InPagehtml)
				PageNum = len(imgPageUrl)
				# 循环获取并保存图片
				for l in range(PageNum):
					GetPageImg = url + imgPageUrl[l]
					print(GetPageImg)
					PageImgeName = getImgDir + imgPageUrl[l].split('/')[-1]
					print(PageImgeName)

					# 获取内部图片
					if os.path.isfile(PageImgeName):
						print("此图片已存在:",PageImgeName)
						continue

					else:
						try:
							time.sleep(1)
							requests.packages.urllib3.disable_warnings()
							Get_PImg = requests.get(GetPageImg, headers=headers,timeout=time_out,verify=False)
							with open(PageImgeName, 'wb') as f:
								f.write(Get_PImg.content)
							Get_PImg.close()
						except Exception as e:
							time.sleep(1)
							requests.packages.urllib3.disable_warnings()
							Get_PImg = requests.get(GetPageImg, headers=headers, timeout=time_out,verify=False)
							print('get the next img with the error:  %s ' % e)
							with open(PageImgeName, 'wb') as f:
								f.write(Get_PImg.content)
							Get_PImg.close()
				if k == len(AllPage) - 1:
					print("当前信息:",AllPage[k])
					continue

				# 继续下一页获取图片
				NewPaperUrl = WebURL + AllPage[k][0]
				print("开始下一页:",NewPaperUrl)
				time.sleep(1)
				requests.packages.urllib3.disable_warnings()
				Get_InPage = requests.get(NewPaperUrl, headers=headers,timeout=time_out)
				Get_InPage.encoding = 'utf-8'
				Get_InPagehtml = Get_InPage.text
				Get_InPage.close()
	print("开始下一轮:",GetAllPage[pagenum])
	try:
		time.sleep(1)
		requests.packages.urllib3.disable_warnings()
		Get_url = requests.get(GetAllPage[pagenum],headers=headers,timeout=time_out)
		Get_url.encoding = 'utf-8'
		Get_html = Get_url.text
		Get_url.close()
	except Exception as e:
		print('get the next info page with the error:  %s ' % e)
		requests.packages.urllib3.disable_warnings()
		Get_url = requests.get(GetAllPage[pagenum],headers=headers,timeout=time_out)
		Get_url.encoding = 'utf-8'
		Get_html = Get_url.text
		Get_url.close()

上述代码正则表达式有点问题,有能力自行修复

另附:完整代码收费出售,18.88买不了吃亏买不了上当

美女图片的Python爬虫实例(二)服务器自用版

 

原创文章,作者:AIRF,如若转载,请注明出处:http://www.ai-rf.com/index.php/2024/03/12/%e7%be%8e%e5%a5%b3%e5%9b%be%e7%89%87%e7%9a%84python%e7%88%ac%e8%99%ab%e5%ae%9e%e4%be%8b%ef%bc%88%e4%ba%8c%ef%bc%89%e8%87%aa%e7%94%a8%e7%89%88/

赞 (0)
AIRFAIRF
上一篇 2024年3月12日
下一篇 2024年3月15日

相关推荐

  • shell脚本入门教程

    shell中多种引号的区别: 双引号” “:允许扩展,允许以$引用其他变量 单引号’ ‘:禁用扩展,即便$也视为普通字符 反引号 “: 将命令的执行输出作为变量值,$()与反引号…

    JAVA&JavaScript 2022年10月8日
  • PyCharm一键脚本激活(亲测有效)PyCharm破解补丁 JetBrains全家桶破解

    前言 最近 jetbrains 官方发布了 2023.2 版本的 pycharm,之前的激活方法并不支持这个新的版本。 下面是最新的激活教程,激活步骤和之前是类似的,只是换用了不同…

    2023年5月31日
  • Python并发编程: concurrent.futures模块的用法

    在Python中,concurrent.futures模块提供了一种简化并行编程的方法。它通过使用线程池或进程池来执行并行任务,从而提高程序的执行效率。本文将介绍concurren…

    python语言 2024年1月24日
  • PyCharm 常用快捷键一览

    简介 工欲善其事必先利其器,PyCharm 是最popular的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半功倍的…

    2023年11月13日
  • Linux Python巡检脚本

    # -*- coding: utf-8 -*- “”” linux 自动化脚本 # @Time: 2022/11/4 10:20 # @Author: lln # @File: l…

    2023年6月2日
  • GScan – Linux安全入侵扫描工具

    宗旨 本程序旨在为安全应急响应人员对Linux主机排查时提供便利,实现主机侧Checklist的自动全面化检测,根据检测结果自动数据聚合,进行黑客攻击路径溯源。 检测项 1、主机信…

    2023年5月9日
  • 美女图片的Python爬虫实例(一)修复版

    该爬虫面向成年人且有一定的自控能力(涉及部分性感图片,仅用于爬虫实例研究) 目标 通过爬虫,得到 [秀人网] 里面的小姐姐并给她们一个温暖的家 衣沾不足惜,但使愿无违 思路 百度 …

    2024年3月12日
  • 优秀运维脚本鉴赏

    一、根据PID过滤进程所有信息 二、根据进程名过滤进程信息 三、根据用户名查询该用户的相关信息 四、加固系统的一些配置

    2024年1月30日
  • 40 个简单又有效的 Linux Shell 脚本示例

    历史上,shell 一直是类 Unix 系统的本地命令行解释器。它已被证明是 Unix 的主要功能之一,并发展成为一个全新的主题。Linux 提供了各种功能强大的 shell,包括…

    JAVA&JavaScript 2023年11月20日
  • Python中zoneinfo模块的用法

    在Python 3.9及更高版本中,引入了zoneinfo模块,用于处理与时区相关的操作。这个模块提供了一种简单而直观的方式来处理时区信息,使得在Python中进行时区转换和时区感…

    python语言 2024年1月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注