该爬虫面向成年人且有一定的自控能力(涉及部分性感图片,仅用于爬虫实例研究)
初始教程
该教程面向服务器版本,为原始升级版
存在问题
原始爬虫存在部分逻辑问题
在笔记本上爬图片太浪费资源(网速、磁盘、内存+一部分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, '远程主机强迫关闭了一个现有的连接。 # 链接: # https://blog.csdn.net/IllegalName/article/details/77164521 # 设置超时时间 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()
上述代码正则表达式有点问题,有能力自行修复
「小礼物走一走?华子可乐来一个!」
还没有人赞赏,支持一下吧
哇~真是太棒了 感谢大佬支持
下载说明:
1.本站资源都是白菜价出售,同样的东西,我们不卖几百,也不卖几十,甚至才卖几块钱,一个永久VIP能下载全站会员专属源码了,所以单独购买也好,会员也好均不提供相关技术服务。
2.如果源码下载地址失效请 提交留言(点击我)进行补发。
3.本站所有资源仅用于学习及研究使用,请必须在24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您权益请联系本站删除!
4.本站站内提供的所有可下载资源(软件等等)本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发);但本网站不能保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug;同时本站用户必须明白,【晓梦云】对提供下载的软件等不拥有任何权利(本站原创和特约原创作者除外),其版权归该资源的合法拥有者所有。
5.请您认真阅读上述内容,购买即以为着您同意上述内容。
晓梦云资源网 » 美女图片的Python爬虫实例(二)服务器版