第一次更新:发现一个问题,就是有时候网页排版有问题的话容易下载到多余章节,如下图所示:

  网站抽风多了一个正文一栏,这样的话就会重复下载1603--1703章节。

  解决办法:

    于是在写入内容前加了一个章节判断,让内容获取从第一章开始,这样就能避免此类问题。如下图:

  这个是对最近学习的一次总结吧。前两天写的,今天才有时间写博客。

  偶然点开笔趣阁的网址(https://www.biquge.cc/),突然觉得我应该可以用爬虫实现小说下载。有这个想法我就开始尝试了。

  

  爬虫呀,说白了就是程序自动模拟浏览器操作来获取网页的内容。

  先用F12查看元素,查看章节网址链接,和章节正文内容。

  结构很简单。

  想法很快就有了,通过网站的搜索打开小说详情页,然后获取每一章的网址url,依次访问每一章网址,再通过正则表达式匹配章节内容,

最后将匹配的内容保存到本地。

  中间忘了一个小的知识点,就是我使用re.findall()来匹配的,它最后返回的时一个列表!!!

  运行结果如下图:

  

  

  代码如下:

  

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/20 15:46
# @Author : yuantup
# @Site :
# @File : biquge.py
# @Software: PyCharm
import urllib.request
import re
import time
import os def open_url(url):
# 打开网址专用
# 以字典的形式设置headers
head = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
# 'Accept-Encoding': 'gzip',
# 接受编码如果是gzip,deflate之类的,可能会报错
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Host': 'sou.xanbhx.com',
'Referer': 'https://www.biquge.cc/',
'Upgrade-Insecure-Requests': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/63.0.3239.132 Safari/537.36', }
# 设置cookies
# proxy = urllib.request.ProxyHandler({'http': '127.0.0.1:8888'})
opener = urllib.request.build_opener()
# 遍历字典,将其转换为指定格式(外层列表,里层元组)
headers = []
for key, value in head.items():
item = (key, value)
headers.append(item)
opener.addheaders = headers
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read()
time.sleep(1)
return html def novel_detail(book_name):
# 根据传入的小说名字获取到小说的详情页,并提取出小说内容(详情,每个章节的网址)
# 小说存在重名情况!!!待解决
zh_book_name = urllib.request.quote(book_name)
url = 'https://sou.xanbhx.com/search?siteid=biqugecc&q=' + zh_book_name
html = open_url(url).decode('utf-8')
# print(html)
name_pa = '<span class="s2">.*?<a href="(.*?)" target="_blank">.*?(\S*?)</a>'
name_list = re.findall(name_pa, html, re.S)
# print(name_list[1])
if name_list[0][1] == book_name:
book_url = name_list[0][0]
print(book_url)
elif not name_list:
print('')
print('对不起,该网址没有找到你需要的书。')
return book_url def content(url):
# 获取小说正文
html = open_url(url).decode('utf-8')
# print(html)
main_body_pa = r'最新章节(提示:已启用缓存技术,最新章节可能会延时显示,登录书架即可实时查看。).*?<dt>(.*?)</div>'
chapter_url_pa = r'<a style="" href="(.*?)">'
main_body = re.findall(main_body_pa, html, re.S)
# print(main_body, ' 1')
# 记住re.findall()方法返回的时一个列表!!!
chapter_url = re.findall(chapter_url_pa, main_body[0])
# print(chapter_url, ' 2')
time.sleep(2)
return chapter_url def save_novel(novel_url, content_url_list, book_name):
# 保存小说内容
for i in range(len(content_url_list)):
real_url = novel_url + content_url_list[i]
html = open_url(real_url).decode('utf-8')
# print(html)
chapter_name_pa = '<h1>(.*?)</h1>'
chapter_name = re.search(chapter_name_pa, html).group(1)
# print(chapter_name)
# print(type(chapter_name))
content_pa = r'<div id="content">(.*?)<script>'
content1 = re.findall(content_pa, html, re.S)
content2 = content1[0].replace('&nbsp;&nbsp;&nbsp;&nbsp;', ' ')
content3 = content2.replace('<br/>', '\n')
content4 = content3.replace('</br>', '')
re_chapter_name = chapter_name.replace(' ', '')
content5 = content4.replace(re_chapter_name, '')
# 有些章节内容包括章节名,这里替换掉它们。
whole_content = ' ' + chapter_name + '\n' + content5
# print(whole_content)
# print(chapter_name)
with open(book_name + '.txt', 'a', encoding='utf-8') as f:
f.write(whole_content)
print('成功下载 {}'.format(chapter_name))
time.sleep(1) def main():
path = r'E:\spiser_sons\books'
a = os.getcwd()
print(a)
if os.path.exists(path):
os.chdir(path)
print(os.getcwd())
else:
os.mkdir(path)
os.chdir(path)
book_name = input('请输入想下载小说的名字:')
novel_url = novel_detail(book_name)
content_url_list = content(novel_url)
save_novel(novel_url, content_url_list, book_name) if __name__ == '__main__':
main()

还有几个问题有待解决:

  1.下载速度过慢,基本上一章2秒钟,几百万字的网文(1500+章)基本就要快一个小时了,亲测。。。。

  2.小说有重名的话就很麻烦,只会下载排第一的。不过这个再添加一个作者判断应该可以解决。

免app下载笔趣阁小说的更多相关文章

  1. python入门学习之Python爬取最新笔趣阁小说

    Python爬取新笔趣阁小说,并保存到TXT文件中      我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...

  2. bs4爬取笔趣阁小说

    参考链接:https://www.cnblogs.com/wt714/p/11963497.html 模块:requests,bs4,queue,sys,time 步骤:给出URL--> 访问U ...

  3. Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说

    注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途! 今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取 初体验Jsoup <!-- Ma ...

  4. Python爬取笔趣阁小说,有趣又实用

    上班想摸鱼?为了摸鱼方便,今天自己写了个爬取笔阁小说的程序.好吧,其实就是找个目的学习python,分享一下. 1. 首先导入相关的模块 import os import requests from ...

  5. HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件

    前言 首先先介绍一下Jsoup:(摘自官网) jsoup is a Java library for working with real-world HTML. It provides a very ...

  6. scrapycrawl 爬取笔趣阁小说

    前言 第一次发到博客上..不太会排版见谅 最近在看一些爬虫教学的视频,有感而发,大学的时候看盗版小说网站觉得很能赚钱,心想自己也要搞个,正好想爬点小说能不能试试做个网站(网站搭建啥的都不会...) 站 ...

  7. python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说

    使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<undersco ...

  8. 笔趣阁小说 selenium爬取

    import re from time import sleep from lxml import etree from selenium import webdriver options = web ...

  9. scrapy框架爬取笔趣阁

    笔趣阁是很好爬的网站了,这里简单爬取了全部小说链接和每本的全部章节链接,还想爬取章节内容在biquge.py里在加一个爬取循环,在pipelines.py添加保存函数即可 1 创建一个scrapy项目 ...

随机推荐

  1. linux常用命令 grep命令

    linux grep命令 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配行打印出来 grep 全称 Grobal Regular Expression Pr ...

  2. json对象转对象

    方式1:var obj = JSON.parse(jsonObject); 方式2:var obj = eval("("+jsonObject+")");

  3. springboot秒杀课程学习整理1-6

    1)活动模型设计 配饰秒杀的模型(promoModel)id promoName startDate(建议使用joda-time) endDate itemId promoItemPrice 数据库( ...

  4. mask_rcnn训练自己的数据集

    1.首先从官方下载mask_rcnn源码https://github.com/matterport/Mask_RCNN 2.首先将demo.ipynb转换成demo.py,这里我顺便更改为适用于我自己 ...

  5. 【Java集合系列四】HashSet和LinkedHashSet解析

    2017-07-29 16:58:13 一.简介 1.Set概念 Set可以理解为集合,非常类似数据概念中的集合,集合三大特征:1.确定性:2.互异性:3.无序性,因此Set实现类也有类似的特征. 2 ...

  6. Data assimilation

    REF: https://en.wikipedia.org/wiki/Data_assimilation Data assimilation is the process by which obser ...

  7. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__', ' ...

  8. MySQL 必知必会学习笔记(常用命令二)

    CREATE TABLE students(student_id INT UNSIGNED, name VARCHAR(30), sex CHAR(1), birth DATE, PRIMARY KE ...

  9. StringBuffer&StringBuilder

    对字符串修改时,用到StringBuffer&StringBuilder,能够多次修改对象并且不产生新的未使用对象 StringBuilder线程不安全(不能同步访问),速度有优势,多数情况下 ...

  10. Python元组的一点用法

    #python的基本语法网上已经有很多详细的解释了,写在这里方便自己记忆一些 元组可以理解为不可变动的列表,访问元组中元素的方式和列表相同,但是需要注意的是元组中的元素是不可修改(增删)的 1.列表的 ...