Python爬虫实战爬取IU高清大图

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫实战爬取IU高清大图相关的知识,希望对你有一定的参考价值。


我们的目的,IU那么漂亮,爬!

最近刷dy突然看到了好几张IU的高清壁纸,我直接马上换成手机壁纸,今天就来网上爬虫下载一些IU的高清大图,冲冲冲!
有图为证:
在这里插入图片描述


一.准备工作

准备一些必要的库:

import requests
from bs4 import BeautifulSoup
import os

网址:

https://www.tt98.com/tag/IU/index.html

二.具体分析

首先我们来看看这个网页的组成,我们发现网页中所有的图片并不在同一个页面中,它分为很多图集,你需要单独点进去然后再一张一张切换。

所以我们需要通过主页面网址找到每个图集的网址,然后根据每个图集的网址找到每个图集里面每张图片的网址

打开主页面网址以后直接点F12打开开发者界面。如下图所示:
在这里插入图片描述
可以看到每个图集的网址存放在<div class = "listbox">...</div>下行的a标签的href中。

点入图集可以发现每张图片的网址极其具有规律,它们前边的部分是一样的,后面按0-9的顺序排了下去(有n张图片就是从0-n-1):
在这里插入图片描述
分析了网址的结构以后我们就可以开始爬取图片了!

三.具体步骤


完整代码在最后面!


(1)将HTML文本提取出来

def getHtmlText(url):
	#url为需要提取的网址
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        #返回HTML文本内容
        return r.text
    except:
        return "爬取失败!"

(2)第一步解析获得各个图集网址

def fillUnivList1(html,ulist):
	#html为上一步获得的HTML文本内容,ulist列表存放每个图集的网址
    soup = BeautifulSoup(html,'html.parser')
    photos = soup.find_all('div',{'class':'listbox'})
    for photo in photos:
        photo_link = photo.a
        ulist.append(photo_link['href'])

结果如下(需要自己加https://www.tt98.com进行拼接得到完整图集网址):

['/sjbz/61712.html', '/sjbz/61079.html', '/sjbz/59095.html', '/sjbz/57353.html', '/sjbz/57251.html', '/sjbz/57039.html', '/sjbz/56597.html', '/sjbz/56449.html', '/sjbz/55059.html', '/sjbz/50945.html', '/sjbz/50742.html', '/sjbz/50655.html', '/sjbz/50209.html', '/sjbz/49132.html', '/sjbz/47552.html', '/sjbz/47400.html', '/sjbz/47184.html', '/sjbz/41297.html', '/sjbz/41247.html', '/sjbz/39317.html']

(3)第二步解析获得图集中每张图片所在页面网址


这里由于界面内容有js编写,无法直接提取网址,所以我根据规律发现每个图集中每张页面的网址与图集中网址有一定联系,来构造页面网址。

比如说:第一个图集页面网址为https://www.tt98.com/sjbz/61712.html,而该图集中每张图片所在网址依次为https://www.tt98.com/showinfo-3-61712-0.htmlhttps://www.tt98.com/showinfo-3-61712-1.html…所以我们只要知道有几张图片并且将图集网址中数字提取出来就可以构建所有页面的网址。


#提取出每个图集的图片个数
def fillUnivList2(html):
    soup = BeautifulSoup(html,'html.parser')
    photo = soup.find('a',{'class':'photo-a'})
    return photo['zong']
#构建每个页面的网址
aim = url1+'/showinfo-3-'+match.group(0)+'-'+str(j)+'.html'

部分页面网址截图如下:
在这里插入图片描述

(4)第三步解析获得每张图片网址

def fillUnivList3(html):
    soup = BeautifulSoup(html,'html.parser')
    photo = soup.find('a',{'class':'photo-a'})
    return photo.find('img').attrs['src']

部分图片网址截图如下:
在这里插入图片描述

(5)下载图片

def saveFig(target):
    root = 'D://爬虫图片//'
    path = root+target.split('/')[-1]
    
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            r = requests.get(target)
            with open(path,'wb') as f:
                f.write(r.content)
                f.close()
        else:
            print("该文件已存在")
    except:
        print("爬取失败")

上截图:
在这里插入图片描述

四.完整代码

import requests
from bs4 import BeautifulSoup
import os

def getHtmlText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        #调整编码方式,使这正常显示
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "爬取失败!"
    
def fillUnivList1(html,ulist):
    soup = BeautifulSoup(html,'html.parser')
    photos = soup.find_all('div',{'class':'listbox'})
    for photo in photos:
        photo_link = photo.a
        ulist.append(photo_link['href'])
        
def fillUnivList2(html):
    soup = BeautifulSoup(html,'html.parser')
    photo = soup.find('a',{'class':'photo-a'})
    #‘zong’属性中存放每个图集的图片个数
    return photo['zong']

def fillUnivList3(html):
    soup = BeautifulSoup(html,'html.parser')
    photo = soup.find('a',{'class':'photo-a'})
    return photo.find('img').attrs['src']

def saveFig(target):
	#存储路径
    root = 'D://爬虫图片//'
    path = root+target.split('/')[-1]
    
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            r = requests.get(target)
            with open(path,'wb') as f:
                f.write(r.content)
                f.close()
        else:
            print("该文件已存在")
    except:
        print("爬取失败")
    

if __name__ == '__main__':
	#存放每个图集网址
    ulist = []
    url = "https://www.tt98.com/tag/IU/index.html"
    html = getHtmlText(url)
    fillUnivList1(html,ulist)
    url1 = 'https://www.tt98.com'
    for i in ulist:
        #正则表达式匹配网址中的数字
        match = re.search(r'\\d{5}',i)
        
        url2 = url1+i
        html2=getHtmlText(url2)
        #num为每个图集中图片的个数
        num = fillUnivList2(html2)
        for j in range(int(num)):
        	#生成每张图片页面网址
            aim = url1+'/showinfo-3-'+match.group(0)+'-'+str(j)+'.html'
            html3 = getHtmlText(aim)
            #target为每张图片的链接
            target = fillUnivList3(html3)
            #保存图片
            saveFig(target)

以上是关于Python爬虫实战爬取IU高清大图的主要内容,如果未能解决你的问题,请参考以下文章

凌晨一点肝文1920×1080高清必应壁纸爬取,只为爬虫小白们入门!!!

Python爬虫腾讯视频m3u8格式分析爬取(附源码,高清无水印)

利用python爬虫关键词批量下载高清大图

十一个爆火的Python爬虫实战项目源码不用谢

爬虫高玩教你用Python每秒钟下载一张高清大图,快不快?

爬虫实例—— 爬取高清4K图片