Python实现小说下载

为期二十天的实训终于结束了,二十多天的硬件培训确实学到了不少,但是一个人做完整个课设确实有点小累。搞完了课设最后的项目之后,又跑来学了一下python。与其说是学,不如说是将以前学过的知识运用起来做一个小东西。

开发环境 : Windows + sublime

爬取的小说网站是 : http://www.biqukan.com/3_3042/(遮天是一部写的比较好的小说,有很多语言写的很经典)

首先打开一章小说内容,打印小说的内容(之后封装成函数,返回内容)

    # 获取当前这章小说的内容
    def get_content(self, url):

    	#请求页面
        res = requests.get(url=url)
        # 利用lxml剖析网页
        soup = BeautifulSoup(res.text, "lxml")
        # 找到包含内容的元素
        result = soup.find_all('div', class_="showtxt")
        # 去掉内容前面的换行与空格
        texts = result[0].text.replace('\xa0' * 8, '\n')
        # 打印当前url网页中小说内容(一个章节)
        # print(texts)
        return texts

然后找到小说目录的页面,并迭代,取出所有章节的url和标题

#定义一个结构体
class download_novel(object):

	# 初始化函数
    def __init__(self):

    	# 之后提取网页需要加上的部分
        self.begin = "http://www.biqukan.com"
        # 小说章节所在的网页
        self.target_url = "http://www.biqukan.com/3_3042/"
        # 定义一个存储小说网页的空列表,用于保存迭代后的每章小说的网址
        self.target_urls = []
        # 定义一个存储小说每章题目的空列表
        self.title = []
        # 定义一个变量存储小说的章数,用于最后输出
        self.nums = 0

    # 定义一个函数,获取每章的题目和下载的网址
    def get_download_url(self):

    	# 请求小说题目所在的网站
        res = requests.get(url=self.target_url)
        # 利用lxml剖析网页
        soup = BeautifulSoup(res.text, "lxml")
        # 找到包含所有题目的元素
        result = soup.find_all('div', class_="listmain")
        # 提取result中所有的超链接
        a_list = BeautifulSoup(str(result[0]), "lxml").find_all('a')
        # 切片,除掉前面不需要的部分
        self.nums = len(a_list[12:])
        # 开始迭代页面
        for each in a_list[12:]:
            # 将每章小说的题目添加到title空列表中
            self.title.append(each.string)
            # 将每章小说的网址添加到target_urls空列表中(提取出来的只有一部分,需要加上self.begin才能构成完整的网站)
            self.target_urls.append(self.begin + each.get('href'))

最后就是将爬取下来的内容保存到本地 :

    def write_content(self, name, path, text):

        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)	
            f.write('\n\n')

最后加一个主函数,开始运行就可以开始下载小说了,因为这开的是单线程,所以下载速度超级慢,等待时间可以睡个觉了。我运行了几次才下载完,最心痛的就是有次下载了80%,网站把IP封了,不让我爬了,心累,换了个网段才开始重新下载。

其实写完这个还是有点想法的,开始就准备直接写,没有打算用函数封装,后来发现重复代码较多,就直接封装为函数,确实方便了很多,后来在主函数去调用函数去获取url的时候,程序报错,就改成了结构体,就改好了。

最后的心得就是 :单线程真的是分分钟叫你做人,速度真的是慢,还是多线程好

猜你喜欢

转载自blog.csdn.net/ydydyd00/article/details/80950627