python下载小说

我以前喜欢看小说,玄幻,武侠,修真是我的最爱,刚学python不久,出于我对小说的热爱,我写了个脚本用来下载我经常看的笔趣阁网站首页所有的小说

首先得到网站首页的html,分析首页中有多少小说,循环得到小说的html,提取出小说名字,创建小说名字为名的文本,将每一章节的章节名和内容提取出来写入到文本中,循环直到最后一个章节,然后开始下一本小说

我这里是先把html下载到本地G:\url\中,然后读取的,其实直接打开url也可以。之前运行时有时候会卡在某个地方,得不到某个网页,我以为是缓存的问题,其实不是。解决方法是我设置了五秒中的超时和异常处理。如果五秒钟得不到这一章节的页面那么就跳过下载下一章

# -*- coding: utf-8 -*-
#   -------------------------------------------
#   下载http://www.biquge.la笔趣阁首页上显示的所有小说
#   下载的小说存放在G:\txt文件夹下
#   -------------------------------------------
#   2014/8/23
#   wyp
#   -------------------------------------------
 
 
import re
import urllib
import os
import socket
 
def getHtml(url):
    reg = r'http:\.\.(.*)'
    res = re.compile(reg)
    urlstr = url.replace('/', '.')
    print urlstr
    name = re.findall(res, urlstr)
    urlpathname = r'G:\url' +'\\' + name[0]
    print 'urlpathname = '+urlpathname 
    try:
        socket.setdefaulttimeout(5.0)
        urllib.urlretrieve(url, urlpathname)
    except:
        pass
    print 'getHtml ---------------over'
    return urlpathname
 
def getBook(html):
    reg = r'<a href="/book/(.*?)/'
    res = re.compile(reg)
    Book = re.findall(res, html)
    return Book
 
def getName(html):
    reg = r'<h1>(.*?)</h1>'
    res = re.compile(reg)
    name = re.findall(res, html)
    return name
 
def getZhangJie(html):
    reg = r'<dd><a href="(.*?)">(.*?)</a>'
    res = re.compile(reg)
    zhangJie = re.findall(res, html)
    return zhangJie
 
def getContent(html):
    reg = r'<div id="content">(.*?)</div>'
    res = re.compile(reg)
    content = re.findall(res, html)
    return content
 
 
if __name__ == "__main__":
    url = raw_input("please input url: ")
    urlpathname = getHtml(url)
    print urlpathname
    f1 = open(urlpathname, 'rb+')
    html = f1.read()
    print html
    Book = getBook(html)
     
    #去重保持元素顺序
    book = list(set(Book))
    book.sort(key=Book.index)
    for b in book:
        realurl = url + '/book/' + b + '/'
        print realurl
 
        realurlname = getHtml(realurl)
        print realurlname
        f2 = open(realurlname, 'rb+')
        realhtml = f2.read()
        BookName = getName(realhtml)
 
        filepath = os.path.join(r"G:\txt", BookName[0])
        filename = filepath + '.txt'
        print filename
 
        if os.path.exists(filename):
            continue
        fd = open(filename, 'w+')
 
        zhangjie = getZhangJie(realhtml)
        for zj in zhangjie:
            sonurl = realurl + zj[0]
            print "url = %s" % sonurl
            try:
                sonurlname = getHtml(sonurl)
                print '-----'+sonurlname
            except:               
                continue
 
            try:
                f3 = open(sonurlname, 'rb+')
            except IOError:
                continue
            sonhtml = f3.read()
            zhangjieming = getName(sonhtml)
            if len(zhangjieming) == 0:
                continue
                 
            fd.write('\t\t\t\t\t' + zhangjieming[0] + '\r\n')
            print "downding  " + zhangjieming[0]
            fd.write('\r\n')
            fd.flush()
             
            try:
                content = getContent(sonhtml)
            except:
                pass
            if len(content) == 0:
                continue
             
            c1 = content[0].replace('<br />', '')
            c2 = c1.replace(' ', ' ')
            fd.write(c2)
            fd.write('\r\n\r\n\r\n\r\n')
            fd.flush()
        fd.close()
         
        f2.close()
        f3.close()


<think>嗯,用户想了解Python小说下载器。首先,我需要确定用户的具体需求。他们可能想下载小说,但不知道如何用Python实现。可能需要解释基本原理、技术栈、步骤,以及注意事项。 用户可能是编程新手,所以需要结构清晰,分步骤说明。要确保回答准确,但也要易懂。可能需要提到络请求库如requests,解析库如BeautifulSoup,还有数据存储部分,比如保存为txt文件。 同时,用户可能关心法律问题,得提醒遵守版权法规,不能侵犯作者权益。还要注意反爬机制,比如设置请求头,控制请求频率,避免被封IP。 可能需要给出一个简单的代码示例,展示整个流程,从发送请求到保存文件。但代码要正确,并且加上注释,方便理解。另外,要指出实际项目可能需要更复杂的处理,比如登录、验证码、分页下载等。 还要考虑用户可能的扩展需求,比如多线程加速,或者支持不同的站结构。但作为介绍,保持基础内容,不过可以提到这些高级功能供进一步学习。 总之,回答要涵盖原理、技术选型、实现步骤、代码示例、注意事项,以及可能的扩展方向。确保信息准确,结构清晰,帮助用户逐步理解如何构建一个简单的Python小说下载器。</think>我为您介绍Python小说下载器的实现原理和开发要点: 一、核心原理 1. 络请求:通过HTTP请求获取小说站页面内容 2. 数据解析:从HTML中提取标题、章节、正文等信息 3. 数据存储:将解析内容保存为txt/电子书格式 二、技术栈 ```python # 常用工具库 import requests # 络请求 from bs4 import BeautifulSoup # HTML解析 import re # 正则表达式 import time # 请求间隔控制 ``` 三、实现步骤 1. 获取目录页 ```python def get_chapter_list(url): headers = {'User-Agent': 'Mozilla/5.0'} # 模拟浏览器访问 response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 提取章节链接(示例选择器需根据具体站调整) return [a['href'] for a in soup.select('.chapter-list a')] ``` 2. 下载单章内容 ```python def download_chapter(chapter_url): response = requests.get(chapter_url) soup = BeautifulSoup(response.text, 'html.parser') # 提取章节标题和正文(示例选择器需调整) title = soup.find('h1').text.strip() content = soup.find('div', class_='content').text.strip() return title, content ``` 3. 数据存储 ```python def save_to_txt(book_name, chapters): with open(f"{book_name}.txt", "w", encoding="utf-8") as f: for title, content in chapters: f.write(f"{title}\n\n{content}\n\n") ``` 四、注意事项 1. 法律合规性 - 仅下载授权资源 - 遵守站robots.txt协议 - 不得用于商业用途 2. 反爬对策 ```python # 建议配置 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Referer': 'https://www.example.com' } # 设置请求间隔 time.sleep(random.uniform(1, 3)) # 随机延时1-3秒 ``` 五、扩展功能建议 1. 多线程/异步下载加速 2. 自动识别站结构 3. 异常重试机制 4. 进度显示功能 5. 格式转换(EPUB/MOBI等) 实际开发时需要根据目标站的具体HTML结构调整选择器,建议先使用开发者工具分析页结构。请注意遵守相关法律法规,尊重作者版权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值