找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 520|回复: 5

[求助] 爬虫小白求助!下载某网站的某部小说一直不成功!

2

主题

7

帖子

7

积分

贫民

积分
7
cp9 发表于 2019-4-7 16:13:44 | 显示全部楼层 |阅读模式

import requests
from bs4 import BeautifulSoup

class Downloader(object):
    """
    定义一个下载整本小说的类
    """
    def __init__(self):
        self.server = 'https://www.biqukan.com/'   # 属性一:笔趣看html
        self.target = 'https://www.biqukan.com/1_1094/'   # 属性二:《一念永恒》的html
        self.names = []     # 属性三:定义一个列表用于存放各章节名
        self.urls = []      # 属性四:定义一个列表用于存放章节的连接地址
        self.nums = 0       # 属性五:章节数

    """
    定义一个类的方法:获取该本小说的各个章节的网址
    """
    def get_download_url(self):
        req = requests.get(self.target)
        div_bf = BeautifulSoup(req.text, "lxml")
        div = div_bf.find_all('div', {'class': 'listmain'})   
        a_bf = BeautifulSoup(str(div[0]), "lxml")         
        a = a_bf.find_all('a')                    # 各章连接放在节点a中
        self.nums = len(a[16:])                   # 计算总章节数,从第十五个连接地址开始
        for each in a[16:]:
            self.names.append(each.string)        # 获得各个章节名称
            self.urls.append(self.server + each.get('href'))   # 获得各个章节的网址

    """
    定义一个类的方法:获得各个章节的文字内容
    """
    def get_contents(self, target):
        req = requests.get(target)
        bf = BeautifulSoup(req.text, "lxml")
        texts = bf.find_all('div', {'class': 'showtxt'})
        texts = str(texts[0].text.replace('\xa0'*8, '\n\n'))
        return texts

    """
    定义一个类的方法:将爬取到的内容写入文件中
    """
    def writer(self, name, path, text):
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')


def main():
    dl = Downloader()
    dl.get_download_url()
    print('《一念永恒》开始下载:')
    for i in range(dl.nums):
        dl.writer(dl.names, '一念永恒.text', dl.get_contents(dl.urls))
    print('《一念永恒》下载完成!')


if __name__ == '__main__':
    main()



结果:D:\python3.6.1\python.exe D:/python保存库/spider/story_allspider.py《一念永恒》开始下载:Traceback (most recent call last):  File "D:/python保存库/spider/story_allspider.py", line 67, in <module>    main()  File "D:/python保存库/spider/story_allspider.py", line 60, in main    dl.writer(dl.names, '一念永恒.text', dl.get_contents(dl.urls))  File "D:/python保存库/spider/story_allspider.py", line 41, in get_contents    texts = str(texts[0].text.replace('\xa0'*8, '\n\n'))IndexError: list index out of rangeProcess finished with exit code 1

回复

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
小白要学习 发表于 2019-4-8 15:55:38 | 显示全部楼层
最基本的,好像没有close
回复 支持 反对

使用道具 举报

0

主题

458

帖子

458

积分

骑士

积分
458
sheeboard 发表于 2019-4-8 16:02:10 | 显示全部楼层
本帖最后由 sheeboard 于 2019-4-8 16:03 编辑

requests.get的用法检查一下,看 req,bf,texts有没有内容,注意空数据异常处理,用try。texts前面是list后面变string,不同类型变量别同名。
回复 支持 反对

使用道具 举报

2

主题

7

帖子

7

积分

贫民

积分
7
cp9  楼主| 发表于 2019-4-9 09:59:53 | 显示全部楼层
小白要学习 发表于 2019-4-8 15:55
最基本的,好像没有close

with open...形式不用close吧
回复 支持 反对

使用道具 举报

2

主题

7

帖子

7

积分

贫民

积分
7
cp9  楼主| 发表于 2019-4-9 10:04:53 | 显示全部楼层
sheeboard 发表于 2019-4-8 16:02
requests.get的用法检查一下,看 req,bf,texts有没有内容,注意空数据异常处理,用try。texts前面是list后 ...

requests.get的适用没问题。主要是我想下载整部小说下来,只能下载到一部分,它就跳出这个结果了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

4

积分

贫民

积分
4
P指向NULL 发表于 2019-4-26 19:03:23 | 显示全部楼层
报错先自己看下错误提示。都有写的啊。要学会自己debug,这个是列表索引越界问题。
  1. exts = str(texts[0].text.replace('\xa0'*8, '\n\n'))
复制代码

当texts = bf.find_all('div', {'class': 'showtxt'})匹配为None的时候,再执行text[0]是会报列表索引越界的。因为这是个空列表,没有索引0.。。懂了吧。
此外,学爬虫,推荐 requests库和Scrapy框架。request这个库基本请求方法要会,Scrapy可配置程度比较高,支持高并发请求,自己只需要写少量代码就能爬了。大规模爬取还能用分布式。你如果学scrapy的话,可以交流下。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表