• 获取取并下载tuku的漫画的爬虫


    代码地址如下:
    http://www.demodashi.com/demo/12842.html

    概述

    一个简单的爬虫,实现是爬取tuku网站的漫画。并下载到脚本的文件夹中,下载的漫画按照章节名放在各自的文件夹中,本脚本直接命令行执行,无图形界面

    详细

    一、 主要思路

    1. 通过requests连接索引页面
    2. 获取索引页中给漫画的所有章节的网址,并保存到一个list中,
    3. 遍历章节的列表,并通过给网址传参,获取页面的状态码判断页面是否存在,如果页面不存在,就是代表该章节没有更多图片了,退出该章节。
    4. 如果页面存在,就获取该页面的图片元素,取得该元素的href的内容,也就是图片的源地址
    5. 打开源地址,将图片文件保存在本地,先建立章节名的文件夹,然后再将文件保存到该文件夹中去。
    6. 循环步骤3-5,直到章节列表中的项都遍历完,退出脚本。完成整个漫画的下载工作。

    二、准备工作

    1. 需要安装的外部库,如果本机已经有安装,跳过这个步骤
    pip install BeautifulSoup
    pip install requests
    
    1. 导入库
    from time import sleep
    import os,requests,random
    from bs4 import BeautifulSoup
    

    三、实现过程的部分代码展示

    1. 在主执行中指定漫画的网址
    if __name__ == '__main__':
        url = 'http://www.tuku.cc/comic/XXXXX/' #漫画的网址
        chapter_list = get_chapterlist(url)
        print(chapter_list)
        for chapter in chapter_list:
            # 遍历取出章节名、网址,依次打开页面,获取图片的网址,下载保留图片
            print(chapter_list[chapter])
            get_chapterdetail(chapter,chapter_list[chapter])
    
    1. 通过requests库获取索引页中的所有章节的网址,将获取的网址保存到一个list
    chapterlist_data = soup.find('div', {'id': 'chapterlistload'})
        chapterlist = chapterlist_data.find_all('a', {'class': 'ib'})
        chapter_dict = {}
        for chapter in chapterlist:
            chapter_name = chapter.text
            chapter_url = chapter.get('href')
            chapter_dict[chapter_name] = chapter_url
    
    1. 遍历网址的list,只用网址的页数加一的方式,打开章节的各页,判断返回的页面元素有没有漫画的图片,直接使用requests库的getstatus,判断如果是200,就是有页面,执行下载任务;
        while True:
    
            if page_num > 1:
                new_url = 'http://www.tuku.cc'+chapter_url+'p'+str(page_num)+'/'
            else:
                new_url = 'http://www.tuku.cc'+chapter_url
            print(page_num, new_url)
    
            if requests.get(new_url).status_code == 200:
                # 状态码如果为200,就是有正常的图片。不然就是图片没有了,可以退出
                html_data = requests.get(new_url)
                soup = BeautifulSoup(html_data.text, 'lxml')
                img_url = soup.find('img', {'id': 'cp_image'}).get('src')
                img_name = img_url.split('/')[-1]
    
                print(img_url,img_name)
                #如果获取的地址为空,就是章节没有内容了,退出这个循环
                if not len(img_url):
                    # 当len(img_url)等于0的时候,就是False,not False就是true,
                    # 可以理解为:img_url没有长度是执行
                    # 这个判断也可以写成len(img_url)==0
                    print('章节',chapter_name,'已经内容没有了')
                    break
    
                if not os.path.exists(chapter_name):
                    os.mkdir(chapter_name)
                if requests.get(img_url).status_code == 200:
                    with open(os.path.join(chapter_name, img_name), 'wb') as imgf:
                        imgf.write(requests.get(img_url).content)
                else:
                    print('图片加载失败,没有下载图片',img_name)
            else:
                print(chapter_name + '已经内容没有了,退出')
                break
    
            sleep( random.randint(3, 6))  # 需要休眠时间,随机休眠3到5秒,这样看起来就有点类似人类的浏览
            page_num = page_num+1
    
    1. 再判断图片的地址返回的状态码是不是200,是的话,就执行下载,将图片保存到本地。
        if requests.get(img_url).status_code == 200:
                    with open(os.path.join(chapter_name, img_name), 'wb') as imgf:
                        imgf.write(requests.get(img_url).content)
                else:
                    print('图片加载失败,没有下载图片',img_name)
    
    1. 在各页面的切换中,加入了睡眠的随机数,用于的休眠数秒,使页面的浏览比较类似于人类正常的浏览习惯,属于建议的干扰反爬虫机制的方式
    sleep( random.randint(3, 6))  # 需要休眠时间,随机休眠3到5秒,这样看起来就有点类似人类的浏览
    
    1. 以下为脚本的完整代码
    from time import sleep
    import os,requests,random
    from bs4 import BeautifulSoup
    
    def get_chapterlist(url):
        # 获取页面上的所有章节名和章节的网址,生产一个dict来保存。然后返回
        html_data = requests.get(url)
        soup = BeautifulSoup(html_data.text, 'lxml')
        chapterlist_data = soup.find('div', {'id': 'chapterlistload'})
        chapterlist = chapterlist_data.find_all('a', {'class': 'ib'})
        chapter_dict = {}
        for chapter in chapterlist:
            chapter_name = chapter.text
            chapter_url = chapter.get('href')
            chapter_dict[chapter_name] = chapter_url
        return chapter_dict
    
    def get_chapterdetail(chapter_name,chapter_url):
        # 遍历取出章节名、网址,依次打开页面,获取图片的网址,下载保留图片
        # for chapter in chapter_dict:
        #     chapter_name = chapter
        #     chapter_url = chapter_url
        page_num = 1
    
        while True:
            if page_num > 1:
                new_url = 'http://www.tuku.cc'+chapter_url+'p'+str(page_num)+'/'
            else:
                new_url = 'http://www.tuku.cc'+chapter_url
            print(page_num, new_url)
            if requests.get(new_url).status_code == 200:
                # 状态码如果为200,就是有正常的图片。不然就是图片没有了,可以退出
                html_data = requests.get(new_url)
                soup = BeautifulSoup(html_data.text, 'lxml')
                img_url = soup.find('img', {'id': 'cp_image'}).get('src')
                img_name = img_url.split('/')[-1]
                print(img_url,img_name)
                #如果获取的地址为空,就是章节没有内容了,退出这个循环
                if not len(img_url):
                    # 当len(img_url)等于0的时候,就是False,not False就是true,
                    # 可以理解为:img_url没有长度是执行
                    # 这个判断也可以写成len(img_url)==0
                    print('章节',chapter_name,'已经内容没有了')
                    break
                if not os.path.exists(chapter_name):
                    os.mkdir(chapter_name)
                if requests.get(img_url).status_code == 200:
                    with open(os.path.join(chapter_name, img_name), 'wb') as imgf:
                        imgf.write(requests.get(img_url).content)
                else:
                    print('图片加载失败,没有下载图片',img_name)
            else:
                print(chapter_name + '已经内容没有了,退出')
                break
    
            sleep( random.randint(3, 6))  # 需要休眠时间,随机休眠3到5秒,这样看起来就有点类似人类的浏览
            page_num = page_num+1
    
    
    if __name__ == '__main__':
        # url = 'http://www.tuku.cc/comic/28/' # 名侦探柯南
        url = 'http://www.tuku.cc/comic/17532/' # 龙珠超
        chapter_list = get_chapterlist(url)
        print(chapter_list)
        for chapter in chapter_list:
            # 遍历取出章节名、网址,依次打开页面,获取图片的网址,下载保留图片
            print(chapter_list[chapter])
            get_chapterdetail(chapter,chapter_list[chapter])
    

    运行效果与文件截图

    文件夹运行后的效果截图
    运行效果
    运行结果后的文件结构
    运行结果后的文件结构

    其他补充

    本脚本为爬虫练习作,在该网站没有修改反爬虫的规则的情况下,测试了大部分的漫画,可以正常下载。本脚本仅为交流用,不对对应网站修改反爬虫策略后导致使用功能不正常做后续修改,切勿做其他用途。
    获取取并下载tuku的漫画的爬虫

    代码地址如下:
    http://www.demodashi.com/demo/12842.html

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    js中的面向对象
    js 定时器
    js中 关于DOM的事件操作
    js 函数
    js流程控制;常用内置对象
    js数据类型基础
    js基础语法
    js初识
    css 选择器;盒模型
    软件系统建模之用例视图
  • 原文地址:https://www.cnblogs.com/demodashi/p/9437240.html
Copyright © 2020-2023  润新知