Python爬虫——漫画下载

简介:   在前面的分享中,我们已经知道了如何利用PhantomJS来下载网页中动态加载的图片。本次分享的目标是,下载动漫网页中的漫画,示例网址如下:http://comic.kukudm.com/comiclist/43/ .     分析上面的网页,如果要将页面中的漫画都下载下来,那么首先必须要分析每卷漫画的网址,具体代码如下,其中url_lst为每卷漫画的网址,file_lst为每卷漫画的名字。

  在前面的分享中,我们已经知道了如何利用PhantomJS来下载网页中动态加载的图片。本次分享的目标是,下载动漫网页中的漫画,示例网址如下:http://comic.kukudm.com/comiclist/43/ .
  动漫网页
  分析上面的网页,如果要将页面中的漫画都下载下来,那么首先必须要分析每卷漫画的网址,具体代码如下,其中url_lst为每卷漫画的网址,file_lst为每卷漫画的名字。

def get_url_lst(url):
    url_lst = []
    file_lst = []
    # 讀取網頁
    html = urllib.request.urlopen(url)  
    content = html.read()
    html.close()
    #網頁解析
    soup = BeautifulSoup(content, "lxml")
    table = soup.find_all(id="comiclistn")
    for tr in table[0].children:
        count = 0
        for x in tr:
            if isinstance(x, bs4.element.Tag):
                if count == 0:
                    file_lst.append(x.string)
                if count == 1:
                    url_lst.append(x['href'])
                count += 1

    return url_lst, file_lst

  接着需要对每卷漫画进行下载,可以利用for循环遍历url_lst.利用PhantomJS先分析出每卷漫画总的图片数,利用网址的变化规律(就是网址前面的部分不变,数字部分即为图片的编号)去下载每一页的漫画。还有一个比较重要的问题,就是如何解决urlretrieve下载不完全的问题,这个已在上一篇的分享中讲过。具体实现的代码如下:

for i in range(len(url_lst)):
    #獲取這一頁總的圖片數量
    browser = webdriver.PhantomJS()
    browser.set_page_load_timeout(30) # 最大等待时间为30s
    #当加载时间超过30秒后,自动停止加载该页面
    try:
        browser.get(url_lst[i])
    except (TimeoutException,socket.timeout):
        browser.execute_script('window.stop()')
    source = browser.page_source
    total_page = int(source[source.find('共')+1:source.find('页')])
    browser.quit()
    #创建新文件夹
    os.mkdir(os.path.join("J:\\comic",file_lst[i]))
    #遍历图片的网址
    for j in range(1,1+total_page):
        browser = webdriver.PhantomJS()
        browser.set_page_load_timeout(30) # 最大等待时间为30s
        #当加载时间超过30秒后,自动停止加载该页面
        try:
            browser.get(url_lst[i].replace('/1.htm','/%d.htm'%j))
        except (TimeoutException,socket.timeout):
            browser.execute_script('window.stop()')
        source = browser.page_source
        soup = BeautifulSoup(source,'lxml')
        #获取图片的下载地址,设置图片名称       
        image = soup.find('img')
        url =image.get('src')
        image_name = "J:\\comic\%s\pic_%d.jpg"%(file_lst[i],j)
        #解决下载不完全问题,重新尝试五次后仍未下载完即为下载失败
        try:
            urllib.request.urlretrieve(url,image_name)
            print("%s,第%d张图片下载完毕!"%(file_lst[i],j),time.ctime())
        except (socket.timeout, AttributeError):
            count = 1
            while count <= 5:
                try:
                    urllib.request.urlretrieve(url,image_name)
                    print("%s,第%d张图片下载完毕!"%(file_lst[i],j),time.ctime())
                    break
                except (socket.timeout, AttributeError):
                    err_info = 'Reloading for %d time'%count if count == 1 else 'Reloading for %d times'%count
                    print(err_info)
                    count += 1
            if count > 5:
                with open('J:\\comic\%s\error.txt'%file_lst[i],'a') as f:
                    f.write("%s,第%d张图片下载失败!\n"%(file_lst[i],j))
        browser.quit() 

   这样我们就能愉快地在这个网站上下载自己喜欢的动漫啦~笔者的测试如下:
   浪客剑心下载文件夹



  附上全部代码,欢迎大家测试,也欢迎大家交流~~如有不足之处,还请批评指正^o^~

# -*- coding: utf-8 -*-
import os
import bs4
import time
import socket
import urllib
import urllib.request  
from bs4 import BeautifulSoup  
from selenium import webdriver
from selenium.common.exceptions import TimeoutException

def get_url_lst(url):
    url_lst = []
    file_lst = []
    # 讀取網頁
    html = urllib.request.urlopen(url)  
    content = html.read()
    html.close()
    #網頁解析
    soup = BeautifulSoup(content, "lxml")
    table = soup.find_all(id="comiclistn")
    for tr in table[0].children:
        count = 0
        for x in tr:
            if isinstance(x, bs4.element.Tag):
                if count == 0:
                    file_lst.append(x.string)
                if count == 1:
                    url_lst.append(x['href'])
                count += 1

    return url_lst, file_lst

def main():
    socket.setdefaulttimeout(45)
    url = 'http://comic.kukudm.com/comiclist/43/'
    url_lst, file_lst = get_url_lst(url)
    print('Begin downloading...',time.ctime())           
    for i in range(len(url_lst)):
        #獲取這一頁總的圖片數量
        browser = webdriver.PhantomJS()
        browser.set_page_load_timeout(30) # 最大等待时间为30s
        #当加载时间超过30秒后,自动停止加载该页面
        try:
            browser.get(url_lst[i])
        except (TimeoutException,socket.timeout):
            browser.execute_script('window.stop()')
        source = browser.page_source
        total_page = int(source[source.find('共')+1:source.find('页')])
        browser.quit()
        #创建新文件夹
        os.mkdir(os.path.join("J:\\comic",file_lst[i]))
        #遍历图片的网址
        for j in range(1,1+total_page):
            browser = webdriver.PhantomJS()
            browser.set_page_load_timeout(30) # 最大等待时间为30s
            #当加载时间超过30秒后,自动停止加载该页面
            try:
                browser.get(url_lst[i].replace('/1.htm','/%d.htm'%j))
            except (TimeoutException,socket.timeout):
                browser.execute_script('window.stop()')
            source = browser.page_source
            soup = BeautifulSoup(source,'lxml')
            #获取图片的下载地址,设置图片名称       
            image = soup.find('img')
            url =image.get('src')
            image_name = "J:\\comic\%s\pic_%d.jpg"%(file_lst[i],j)
            ##解决下载不完全问题,重新尝试五次后仍未下载完即为下载失败
            try:
                urllib.request.urlretrieve(url,image_name)
                print("%s,第%d张图片下载完毕!"%(file_lst[i],j),time.ctime())
            except (socket.timeout, AttributeError):
                count = 1
                while count <= 5:
                    try:
                        urllib.request.urlretrieve(url,image_name)
                        print("%s,第%d张图片下载完毕!"%(file_lst[i],j),time.ctime())
                        break
                    except (socket.timeout, AttributeError):
                        err_info = 'Reloading for %d time'%count if count == 1 else 'Reloading for %d times'%count
                        print(err_info)
                        count += 1
                if count > 5:
                    with open('J:\\comic\%s\error.txt'%file_lst[i],'a') as f:
                        f.write("%s,第%d张图片下载失败!\n"%(file_lst[i],j))
            browser.quit()         
main()
目录
相关文章
|
11天前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
13天前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
13天前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑
|
1月前
|
数据采集 存储 JSON
地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房
地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房
|
22天前
|
数据采集 存储 Web App开发
处理Cookie和Session:让Python爬虫保持连贯的"身份"
处理Cookie和Session:让Python爬虫保持连贯的"身份"
|
24天前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
26天前
|
数据采集 存储 XML
Python爬虫入门(1)
在互联网时代,数据成为宝贵资源,Python凭借简洁语法和丰富库支持,成为编写网络爬虫的首选。本文介绍Python爬虫基础,涵盖请求发送、内容解析、数据存储等核心环节,并提供环境配置及实战示例,助你快速入门并掌握数据抓取技巧。
|
1月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
108 0
|
1月前
|
数据采集 Web App开发 JSON
Python爬虫基本原理与HTTP协议详解:从入门到实践
本文介绍了Python爬虫的核心知识,涵盖HTTP协议基础、请求与响应流程、常用库(如requests、BeautifulSoup)、反爬应对策略及实战案例(如爬取豆瓣电影Top250),帮助读者系统掌握数据采集技能。
187 0
|
1月前
|
数据采集 监控 调度
应对频率限制:设计智能延迟的微信读书Python爬虫
应对频率限制:设计智能延迟的微信读书Python爬虫

推荐镜像

更多