获取取并下载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大师代发,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/9437240.html