python3.6爬虫案例:爬取朝秀帮图片

python爬虫 专栏收录该内容
7 篇文章 1 订阅

一、写在前面

        之前写的两篇博客:

第一个案例写了如何在百度音乐歌单中栏中爬取其歌曲以及对应的歌手和歌曲所在的链接,并保存在相应的文件夹下。这个爬虫代码实现难度小,短时间内就可以爬完所有内容。第二个案例则是爬取顶点小说网中的完结小说,难度也不大,但有一点网站存在反爬机制,爬取的速度很慢。

        今天给大家分享的是爬取朝秀帮(https://www.chaoxiubang.com)的图片,目前该网站没有反爬机制,爬取的效率主要取决于网速与代码效率。该网站的代码实现难度适中,难点就是如何针对爬虫遇到的问题,完善程序,最后将网站所有的图片全部爬下来。下面我们慢慢开始今天的内容。

二、首先根据首页内容创建目录文件夹,用于存放不同类型的美女。(不对,是存放美女图片)


我们就根据网页菜单来创建文件夹。从上图(具体怎么打开网页源代码,请看前两篇博客)我们容易发现所需的内容存在于<ul>标签下,下面的子标签<li>代表一个菜单。每一个标签<li>下有不同类型图片的链接和名称,我们只需将其爬取下来保存到本地同时创建相应文件夹即可。我们创建Craw_category_href.py文件,代码如下:

"""
获取网站类目的所有类目名和相应的链接
"""
import time
import requests
import os
# import CrawPageContent
import numpy as np
from bs4 import BeautifulSoup

FILE = 'F:\\python program\\潮秀网图片'
URL = 'https://www.chaoxiubang.com/'

#获取网页信息
def get_html(url):
    html = requests.get(url)
    html.encoding = 'gb2312'
    soup = BeautifulSoup(html.text, 'lxml')
    return soup
#创建类目的文件夹
def CreatFile(File, file):
    path = File
    title = file
    new_path = os.path.join(path, title)
    print(new_path)
    if not os.path.isdir(new_path):
        os.makedirs(new_path)
    return new_path

def main():
    f = open('F:\\python program\\潮秀网图片\\category.txt', 'w', encoding='utf-8')
    soup = get_html(URL)
    # print(soup)
    nav = soup.find('div', attrs={'class':['nav', 'both']})

    li = nav.find_all('a', attrs={'target':'_self'})
    link = []
    for cate in li:
        name = cate.find('span').get_text()
        href = cate['href']
        link.append(name+';'+href)
    count = 1
    for info in link:
        store = info.split(';')
        cattitile = store[0].strip()
        new_path = CreatFile(FILE, cattitile)
        url = store[1].strip()
        f.write(cattitile+';'+url+';\n')
    f.close()
    
if __name__ == '__main__':
    main()

运行一下(当然大家可以根据习惯在其他环境运行)看看结果:


我们已经将每个类型的图片文件夹创建成功,也采集了每个目录的链接。


接下来我们据此爬取更详细的信息。

三、爬取每位美女的链接和描述

有了每个类型的图片地址,我们就可以将该类型下的所有美女的图片地址给爬下来,并将文件放到相应文件夹内。

我们以阳光美女为例:


可以清楚看到,网页也是很规整,并且有很多页,这里呈现的图片是缩略图,其实我们点开缩略图会跳转到该美女的详细页面,里面有高清图。我们采集的就是高清图,不过不要着急,我们先爬下来每个分类下的美女页面的链接。分析网页写出CrawAllPictureUrl.py,代码如下:

"""
爬取网站所有类目下的组图链接,分别写入相应文件夹下的url.txt文件。
"""
import requests
import time
import numpy as np
import urllib.request
from bs4 import BeautifulSoup

#获取网页信息
def get_html(url):
    html = requests.get(url)
    html.encoding = 'gb2312'
    soup = BeautifulSoup(html.text, 'lxml')
    return soup
     
def main():
    imglist = []

    fInput = open('F:\\python program\\潮秀网图片\\category.txt', 'r', encoding='utf-8')
    line = fInput.readline()
    while line:
        lin = line.split(';')
        if int(lin[2]) != 0:
            url = lin[1]
            fraw = lin[0]
            file = open('F:\\python program\\潮秀网图片\\'+fraw.strip()+'\\url.txt', 'w', encoding='utf-8')
            countPage = 1#控制网页跳转
            flag = 1#控制照片命名
            while url:
                print('----------------'+str(countPage))
                time.sleep(np.random.rand())
                try:
                    urlR = url + 'list_' + str(lin[2].strip()) + '_' + str(countPage) + '.html'
                    print(urlR)
                    html = get_html(urlR)
                    imglist = html.find('div', attrs={'class': 'imgList'})
                    for li in imglist.find_all('li'):
                        img = li.find('a')['href']
                        print('it is flag getinfo')
                        file.write(str(flag) + ';' + img + '\n')
                        flag += 1
                    countPage += 1
                except:
                    print('结束')
                    break
            file.close()
            line = fInput.readline()
        else:
            line = fInput.readline()
    fInput.close()
if __name__ == '__main__':
    main()

运行这个程序之前,告诉大家,由于每个类目下跳转页面的链接都有一个数字,比如魅惑第二页链接:


我们构造魅惑页面的跳转链接时每次都shi list_2+“页数”,其他的是其他数字,大家自行查看,最后在第一个程序爬取的category.txt内容中添加一列,用于构造链接,如下图:


接下来可以运行CrawAllPictureUrl.py程序了。运行需要耐心等待了,图片链接太多。我暂时演示爬取魅惑类目下的图片链接:


大家可以看到接近2000个,每个链接下面包括n(10张左右)张高清图。这么多类目的图片加起来共有几十G(第一次爬取完毕,考虑到最近半年多的更新可能更多。)

四、爬取高清大图

我们得到了这么多妹子的链接,还没有结束,我们还没有拿到高清图呢,下面我们就是根据每个类目下的url.txt文件中的链接,爬取每个链接下的图片,我们找个阳光美女下的杨紫图看看。下图圈出来的要作为图片名称



看上图,这时杨紫第一章图片所在页面,我们可以看到一共有6张高清大图,通过“检查”发现,其余图的链接在标签<ul>下,我们依次取出,将图片保存下来即可,废话不多说直接上代码(文件为CrawPicture.py):

"""
此程序考虑的情况很多,下面有注释
"""
import requests, time
import os
import numpy as np
import urllib.request
from bs4 import BeautifulSoup

#tag =['清纯私房','俏皮私房','COSPLAY', '比基尼美女', '魅惑写真',  '日本美女', '丝袜美女', '丝袜美腿', '性感车模', '性感美女', '阳光美女', '长腿美女']
tag = [ '魅惑写真']


URL = 'https://www.chaoxiubang.com'
FILE = 'F:\\python program\\潮秀网图片'
#创建文件夹
def CreatFile(file, title):
    path = file
    title = title
    new_path = os.path.join(path, title)
    if not os.path.isdir(new_path):
        os.makedirs(new_path)
    return new_path

#获取html
def get_html(url):
    html = requests.get(url)
    html.encoding = 'gbk'
    soup = BeautifulSoup(html.text, 'lxml')
    return soup
#判断文件名是否合法,有些图片名中含有非法字符不止一处,所以使用循环判断,直到合法
def judgeName(name):
    flag = True
    while flag:
        if '?' in name:
            name = name.replace('?', '_')
        elif '\\' in name:
            name = name.replace('\\', '_')
        elif '/' in name:
            name = name.replace('/', '_')
        elif ':' in name:
            name = name.replace(':', '_')
        elif ':' in name:
            name = name.replace(':', '_')
        elif '*' in name:
            name = name.replace('*', '_')
        elif '"' in name:
            name = name.replace('"', '_')
        elif '<' in name:
            name = name.replace('<', '_')
        elif '>' in name:
            name = name.replace('>', '_')
        elif '|' in name:
            name = name.replace('', '_')
        else:
            flag = False
    return  name

#获得图片,暂时第一张,因为网站的特点,每一组图片的第二及之后的图片链接和第一张的不一致
#只能分别处理
def get_pic_name(soup):
    h3 = soup.find('h3')
    name = h3.find('a').get_text()
    pic_href = soup.find('div', attrs={'class':'article_left_top_body'})
    src = pic_href.find('img')['src']
    return name, src

def main():
    for category in tag:
        fInput = open('F:\\python program\\潮秀网图片\\url.txt', 'r', encoding = 'utf-8')
        line = fInput.readline()
        while line:
            linesplit = line.split(';')
            countNum = linesplit[0].strip()
            print(time.ctime() + '正在打印' + category + ':第' + str(countNum) + '组')
            url = linesplit[1].strip()
            if URL not in url:
                url =  URL + url
            print(url)
            html = get_html(url)


            try:#有些链接定位不到就继续下一个链接的爬取
                name, src = get_pic_name(html)
                print('-------------'+name)
                name = judgeName(name)
            except:
                line = fInput.readline()  #
                continue

            try:
                print(name+'-------------')
                fOutput = open('F:\\python program\\潮秀网图片\\'+category + '\\'+countNum+'_'+ name + '\\'+ name +'.jpg', 'wb')
                print(fOutput)
                print(category)
            except:
                newpath = CreatFile(FILE+'\\'+category, countNum+'_'+name)
                fOutput = open(newpath + '\\'+ name +'(1).jpg', 'wb')
                print(newpath)
            try:#有些图片不存在,若不存在就继续下一组套图的爬取
                req = urllib.request.urlopen(src)
                buf = req.read()
                fOutput.write(buf)
                fOutput.close()
            except:
                line = fInput.readline()#链接图片不存在跳转到下一页
                continue
            page = 2#控制图片链接的页数,也可以用代码去定位到页数控制,个人感觉这样方便
            while url:#对套图非首页的采集
                try:
                    surl = url[:-5] + '_'+str(page)+'.html'
                    print(surl)
                    html = get_html(surl)
                    sname, src = get_pic_name(html)
                    sname = judgeName(sname)
                    fOutput = open('F:\\python program\\潮秀网图片\\'+category + '\\'+countNum+'_'+ name + '\\'+ sname +'.jpg', 'wb')
                    req = urllib.request.urlopen(src)
                    buf = req.read()
                    fOutput.write(buf)
                    fOutput.close()
                    page += 1
                except:
                    break
            line = fInput.readline()
        fInput.close()
        # break
if __name__ == '__main__':
    main()

运行下程序,效果是这样的:


打开一个文件夹:


有没有很兴奋。名字看起来尺度很大,其实图片很有度的。

五、写在最后。

这个案例是较有难度的,里面代码也有很多可以优化的地方,我自己就看出来了很多,不过这样爬取网站图片速度有点慢。也许大家在看这一个一个文件的时候是否也看到了,我们是分布来的,其实早就有大牛写好了爬虫框架,随着学习的深入,我们可以运用爬虫现有的框架,结合自己爬虫的特点来进行爬取。这 写内容等以后再和大家分享。

(大家要是觉得学到了东西,请关注下,有什么问题欢迎留言交流。)


  • 1
    点赞
  • 1
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值