云卷~云舒 发表于 2016-10-23 23:19

用Python编了一个爬虫,下载小说

    最近刚接触了Python爬虫,比较感兴趣,再加上本人喜欢看小说,就试写了一个下载小说的脚本。    脚本说明:提供小说目录页的网址(仅限笔趣阁网站上的小说:http://www.biquge.com/),代码如下:


import requests
from bs4 import BeautifulSoup
#提取章节内容
def getNovelChapter(url):   
    res = requests.get(url)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text,'html.parser')
    try:
      title = soup.select('.bookname h1').text   
      return title + '\n    ' + '\n    '.join(a for a in soup.select('#content').text.split())
    except IndexError:
      return ''


url = 'http://www.biquge.tw/0_52/'    #小说目录页的网址
headers = {'Host':'www.biquge.tw',
         'Connection':'keep-alive',
         'Cache-Control':'max-age=0',
          'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36'}
res = requests.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')
   
title=soup.select('#info').h1.text    #小说名称提取
author=soup.select('#info').p.text.strip()    #小说作者提取


file = open(title + '.text','w')    #保存文件
file.write(title)
file.write('\n' + author + '\n\n')
            
i = 0
l = int(len(soup.select('#list dd')))
while (i<l):
    ChapterUrl = url + soup.select('#list dd').a['href'].split('/')[-1]
    file.write(getNovelChapter(ChapterUrl) + '\n\n')
    i=i+1
file.close()
print('下载完成')


    问题:1、因只是对某个网站上的网页源码进行解析的,换另一个小说网站可能就不行了,这个暂未去验证;
                2、在涵式getNovelChapter(url)中增加了try except代码,可能会导致某个章节漏下载,若不加这个代码,总是会出现超出界限的错误提示(IndexError: list index out of range),且每次运行,下载下来的章节数目不一样(有时候之下在一百多章,有时候二百来章),至今未搞清楚原因;
                3、另外脚本运行速度比较慢,暂不知道如何提升。
    虽然有许多问题,不过这是本人写的第一个代码,以前没有编程过,当确实下载下来小说时,自我感觉有些小小的激动{:1_912:}。

    初次编写Python脚本,不足之处请大神指点,不胜感激!!!


云卷~云舒 发表于 2016-11-24 21:02

冷亦寒008 发表于 2016-11-21 17:57
我在命令行里直接运行,语法有问题啊。我是3.5的

看你是什么错误,导入的库,你电脑里首先要有

18717911997 发表于 2016-10-24 21:32

为什么我运行楼主的此源码,出现一下错误我的版本是Python2.7
>>> ================================ RESTART ================================
>>>

Traceback (most recent call last):
File "C:\Python27\Python小说网.py", line 22, in <module>
    soup = BeautifulSoup(res.text,'html.pars5er')
File "build\bdist.win32\egg\BeautifulSoup.py", line 1522, in __init__
    BeautifulStoneSoup.__init__(self, *args, **kwargs)
File "build\bdist.win32\egg\BeautifulSoup.py", line 1147, in __init__
    self._feed(isHTML=isHTML)
File "build\bdist.win32\egg\BeautifulSoup.py", line 1189, in _feed
    SGMLParser.feed(self, markup)
File "C:\Python27\lib\sgmllib.py", line 104, in feed
    self.goahead(0)
File "C:\Python27\lib\sgmllib.py", line 174, in goahead
    k = self.parse_declaration(i)
File "build\bdist.win32\egg\BeautifulSoup.py", line 1463, in parse_declaration
    j = SGMLParser.parse_declaration(self, i)
File "C:\Python27\lib\markupbase.py", line 109, in parse_declaration
    self.handle_decl(data)
File "build\bdist.win32\egg\BeautifulSoup.py", line 1448, in handle_decl
    self._toStringSubclass(data, Declaration)
File "build\bdist.win32\egg\BeautifulSoup.py", line 1381, in _toStringSubclass
    self.endData(subclass)
File "build\bdist.win32\egg\BeautifulSoup.py", line 1251, in endData
    (not self.parseOnlyThese.text or \
AttributeError: 'str' object has no attribute 'text'

羊之心羽 发表于 2016-10-23 23:30

那网站不是可以直接下载吗

小补 发表于 2016-10-23 23:34

那网站不是可以直接下载吗

云卷~云舒 发表于 2016-10-23 23:38

羊之心羽 发表于 2016-10-23 23:30
那网站不是可以直接下载吗

有吗,没有看到下载的链接,只是为了写爬虫玩,随便找了个小说网站:Dweeqw

我来看看看 发表于 2016-10-23 23:51

那网站不是可以直接下载吗

绘梨衣 发表于 2016-10-23 23:51

py大法好

Mier52 发表于 2016-10-23 23:52

哈哈哈哈,虽然网站的确可以下载,不过第一次自己写程序爬到数据的成就感是前所未有的

sunpx3 发表于 2016-10-23 23:56

你可以改进下,抓取全站数据, 可以试试 scrapy

MAXtoDEATH 发表于 2016-10-24 10:43

你可以去爬codevs

东方小夕 发表于 2016-10-24 10:55

云卷~云舒 发表于 2016-10-23 23:38
有吗,没有看到下载的链接,只是为了写爬虫玩,随便找了个小说网站

直接爬起点多好呢
页: [1] 2 3 4 5 6 7 8
查看完整版本: 用Python编了一个爬虫,下载小说