Python爬虫:彼岸图网图片爬取

哈哈,这是我第一篇博客
半年以后回来再看发现这代码简直太难看了
现在已经弃用大小驼峰转蛇形命名了
确实好看
除了命名别的也写的不怎么样
因为爬虫只是个爱好所以也不准备再投入时间重构了
将就着看吧

1.主要的库:

1.requests
2.Pillow
请自行安装

2.目标网址:

http://pic.netbian.com/
在这里插入图片描述

声明:此网址是随便找的,代码仅供技术交流使用,如有侵权请联系本人删除

3.思路

如何得到每张图片的具体位置呢?

首先找到在哪一个分页

打开页面,F12查看源码,我的浏览器是Firefox
在这里插入图片描述
然后鼠标移到分页的2上,右键查看元素,可以看到
在这里插入图片描述
这就是每个分页的部分URL,验证一下,浏览器中输入 pic.netbian.com/index_5.html ,自动跳转到彼岸图网第五分页在这里插入图片描述
首页是index.html,分页的部分URL格式为index_[0-9]*.html
在这里插入图片描述然后在分页中找以缩略图形式显示在页面上的子页面URL
上图中为/tupian/24556.html

如果只需要低像素的缩略图的话,现在就可以开始爬了,上图中缩略图图片的部分URL格式为/uploads/allimg/.*a.jpg

注意区分这两个概念

如果需要大图,那么就要在/tupian/24556.html下继续去找大图的具体位置。点开缩略图,右击大图,查看元素,找到格式为/uploads/allimg/.*be.jpg的代码,就是这张大图的URL了。

当然不是所有的大图都是xxxbe.jpg格式的,所以不能用正则匹配be.jpg$的格式去处理,查看子页面中大图代码的位置,都是第一个出现的,其余的都是推荐的相似图片的URL,为了防止重复爬取缩略图图片,可以用正则^/uploads/allimg/.*.jpg去匹配,只要找到一个就break,然后分析下一个子页面的html代码。在这里插入图片描述

如下,在点开缩略图后还有相似图片推荐,为了不重复抓取,会在代码中作处理在这里插入图片描述

4.代码

要写爬虫首先要对Web有一定的了解,要是连查看源码都不会就更别说分析了,所以还是先好好学学Web再去写爬虫,不说会做网页,最起码要能看懂个大概。按我的理解,爬虫实际上就是模拟了浏览器的行为,所以在代码中把上述的步骤实现了就ok

#coding:gbk

'''
Author: CSDN wuming7847
转载请注明出处
'''
import requests
from PIL import Image
from io import BytesIO
import re
from requests.exceptions import HTTPError

root="http://pic.netbian.com/index_%d.html"
#除首页外所有分页的统一格式

uni="http://pic.netbian.com"
#子页面和大图的URL前缀

AllPage=[]
#要爬取的分页URL

AllImgHTML=[]
#缩略图代表的子页面的部分URL,格式为/tupian/.*.html

AllImgURL=[]
#每张大图的部分URL,格式为/uploads/allimg/.*.jpg

def GetPageURL(root,Start,counts):
#得到每个分页的URL放到AllPage中
    if Start==1:
        AllPage.append("http://pic.netbian.com/index.html")
        #将非标准格式的首页URL放入
        for i in range (Start+1,Start+counts):
            newURL=root.replace("%d", str(i))
            AllPage.append(newURL)
    else:   
        for i in range (Start,Start+counts):
            newURL=root.replace("%d", str(i))
            AllPage.append(newURL)
        
def GetImgHTML(AllPage): 
#得到每个分页中子页面的URL放到AllImgHTML中     
    for PageURL in AllPage:
        try:
            res=requests.get(PageURL)
            res.raise_for_status()                      
        except HTTPError:
            print("HTTP Error!")
        
        except ConnectionError:
            print("Failed to connect!")
    
        with open("C:\\Users\\PageFile.txt","w",encoding="ISO-8859-1") as PageFile:
            PageFile.write(res.text)
            PageFile.close()
        
        
        with open("C:\\Users\\PageFile.txt","r",encoding="gbk") as ReadFile:           
            str=ReadFile.read()
            mid=re.split("\"", str)
            #用"进行分割,以进行正则表达式匹配
            for i in mid:           
                ImgHTML=re.findall("^/tupian/.*.html$",i)
                #提取所有符合格式的str放到ImgHTML中
                if len(ImgHTML)!=0:
                    AllImgHTML.append(ImgHTML[0])
                    
def GetImgURL():  
#得到每个分页中每个子页面的大图的URL放到UsefulImgURL中               
    UsefulImgHTML=[None for i in range(len(AllImgHTML))] 
    #为字符串拼接分配内存  
    for i in range(len(AllImgHTML)):
        UsefulImgHTML[i]=uni+AllImgHTML[i]
    #拼接后得到了可用的子页面URL,格式为http://pic.netbian.com//tupian/.*.html
    
    for html in UsefulImgHTML:
    #对图片组进行请求
        try:
            htmlres=requests.get(html)
            htmlres.raise_for_status()           
        except HTTPError:
            print("HTTP Error!")
        
        except ConnectionError:
            print("Failed to connect!")
                        
        with open("C:\\Users\\ImgHTML.txt","w",encoding="ISO-8859-1") as ImgHTML:
            ImgHTML.write(htmlres.text)
            ImgHTML.close()
        
        with open("C:\\Users\\\ImgHTML.txt","r",encoding="gbk") as ReadHTML:           
            str=ReadHTML.read()
            mid=re.split("\"", str)           
            for i in mid:
                ImgURL=re.search("^/uploads/allimg/.*.jpg$",i)              
                if ImgURL is not None:                   
                    AllImgURL.append(ImgURL[0])
                    break
                #爬到一个大图的URL即break。将每张大图的部分URL存入AllImgURL中,格式为/uploads/allimg/.*.jpg
    
    UsefulImgURL=[None for i in range(len(AllImgURL))]
    #拼接得到最终可供下载的URL放到UsefulImgURL中
    for i in range(len(AllImgURL)):
        UsefulImgURL[i]=uni+AllImgURL[i]
        
    return UsefulImgURL                
    
    
                                       
def DownloadWallpaper(url,path):
    try:
        res=requests.get(url)
        res.raise_for_status()
        MyImage=Image.open(BytesIO(res.content))
        MyImage.save(path)
        print("Done...")
    except HTTPError:
        print("HTTP Error!")
    except ConnectionError:
        print("Failed to connect!")
        


if __name__=="__main__":
    GetPageURL(root, 2, 2)
    GetImgHTML(AllPage)
    UsefulImgURL=GetImgURL()            
    num=[]
    for i in range (len(UsefulImgURL)):
        num.append(i)    
    
    UsefulSavePath=[None for i in range(len(UsefulImgURL))]  
    for i in range(len(UsefulSavePath)):
        UsefulSavePath[i]="C:\\Users\\"+str(num[i])+".jpg"
    for i in range(len(UsefulImgURL)):
        print(i,end=" ")
        DownloadWallpaper(UsefulImgURL[i],UsefulSavePath[i])
    print("Task completed!")
    
    
    

说明:
1.要爬取从第几页开始的连续几页,就在主函数中修改GetPageURL(root,start,counts)中start和counts的值
2.自己改存放路径,windows下文件操作的路径是\\而非\
3.图片的名字都是[0-9]*.jpg的格式,有兴趣的可以自己把大图的名字也爬下来设置为图片名称
4.高清原图需要登录,留坑

在这里插入图片描述

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值