第一次更新:发现一个问题,就是有时候网页排版有问题的话容易下载到多余章节,如下图所示:
网站抽风多了一个正文一栏,这样的话就会重复下载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(' ', ' ')
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下载笔趣阁小说的更多相关文章
-
python入门学习之Python爬取最新笔趣阁小说
Python爬取新笔趣阁小说,并保存到TXT文件中 我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...
-
bs4爬取笔趣阁小说
参考链接:https://www.cnblogs.com/wt714/p/11963497.html 模块:requests,bs4,queue,sys,time 步骤:给出URL--> 访问U ...
-
Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说
注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途! 今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取 初体验Jsoup <!-- Ma ...
-
Python爬取笔趣阁小说,有趣又实用
上班想摸鱼?为了摸鱼方便,今天自己写了个爬取笔阁小说的程序.好吧,其实就是找个目的学习python,分享一下. 1. 首先导入相关的模块 import os import requests from ...
-
HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件
前言 首先先介绍一下Jsoup:(摘自官网) jsoup is a Java library for working with real-world HTML. It provides a very ...
-
scrapycrawl 爬取笔趣阁小说
前言 第一次发到博客上..不太会排版见谅 最近在看一些爬虫教学的视频,有感而发,大学的时候看盗版小说网站觉得很能赚钱,心想自己也要搞个,正好想爬点小说能不能试试做个网站(网站搭建啥的都不会...) 站 ...
-
python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说
使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<undersco ...
-
笔趣阁小说 selenium爬取
import re from time import sleep from lxml import etree from selenium import webdriver options = web ...
-
scrapy框架爬取笔趣阁
笔趣阁是很好爬的网站了,这里简单爬取了全部小说链接和每本的全部章节链接,还想爬取章节内容在biquge.py里在加一个爬取循环,在pipelines.py添加保存函数即可 1 创建一个scrapy项目 ...
随机推荐
-
新手程序员随笔2——初识html、css和javascript
翻看博客,发现好久木有发blog了.纠其原因,一则是近来工作上卡到了一个编程难题,我是一个单线程的小猿,当我手头有事情做的时候,我不想分心去做其它事情,如写blog.二则是我个人的写作能力不佳,想到写 ...
-
ID3、C4.5、CART、RandomForest的原理
决策树意义: 分类决策树模型是表示基于特征对实例进行分类的树形结构.决策树可以转换为一个if_then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布. 它着眼于从一组无次序.无规则的样 ...
-
Xilinx SDK Problem Solution in Ubuntu
Problem1: Documention and Example can't open, Xilinx SDK Ubuntu. Step1: Click the Document link o ...
-
PHP内置函数file_put_content(),将数据写入文件,使用FILE_APPEND 参数进行内容追加
file_put_contents(fileName,data,flags,context) 入参说明: 参数 说明 fileName 要写入数据的文件名 data 要写入的数据.类型可以是 stri ...
-
Linux基础--用户和组管理
1.账号管理相关文件 1)/etc/passwd 每一行都代表一个账号,有几行就代表有几个账号在你的系统中,不过需要特别留意的是,里头很多账号本来就是系统中必须要的,我们可以简称他为系统账号, ...
-
6款基于SVG的HTML5CSS3应用和动画
1.CSS3/SVG质感背景小图标 镂空效果图标按钮 今天我们来分享一款用CSS3和SVG实现的质感背景小图标,鼠标滑过图标时出现镂空的效果,并且有质感背景的描边,效果非常不错. 在线演示 源码下载 ...
-
day02 Java基础
1.Java中的关键字都是小写的. 2.Java中的关键字 3.Java中的注释分为:单行注释.多行注释.文档注释 文档注释将被javadoc工具解析生成一个说明书. 4.Java中的常量分为字面值常 ...
-
React-native 中的触摸响应功能
我们在做APP的时候,与桌面应用系统不同的是触摸响应. web页面对触摸响应的支持和原生的APP有着很大的差异. 基本用法 componentWillMount: function() { this. ...
-
poj3589---判断两个数有多接近
#include <stdio.h> #include <stdlib.h> int main() { ],s2[]; int a,b,i,j,n; scanf("% ...
-
quickhybrid】如何实现一个Hybrid框架
章节目录 [quickhybrid]如何实现一个跨平台Hybrid框架 [quick hybrid]架构一个Hybrid框架 [quick hybrid]H5和Native交互原理 [quick hy ...