学了好几天的渗透测试基础理论,周末了让自己放松一下,最近听说天蚕土豆有一本新小说,叫做《元尊》,学生时代的我可是十分喜欢读天蚕土豆的小说,《斗破苍穹》相信很多小伙伴都看过吧。今天我们就来看看如果一步一步爬下来《元尊》的所有内容。

首先我们需要选择一个网站进行爬取,我这边使用的是书家园网站,其它网站的操作也是类似原理。

相关库文件

我们使用的库有requests、re和time,其中re和time都是python自带库,我们只需要安装一个requests库。

pip install requests

编码过程

我们可以先访问书家园网站找到《元尊》书籍首页的url——https://www.shujy.com/5200/9683/。

通过requests进行请求,然后将html打印出来。

import requests
url ='https://www.shujy.com/5200/9683/'
response = requests.get(url)
html = response.text print(html)

打印出来如下图:

我们找到html中关于文章标题和作者的部分

我们通过正则表达式将标题和作者提取出来

title = re.findall(r'<meta property="og:novel:book_name" content="(.*?)"/>',html)[0]
author = re.findall(r'<meta property="og:novel:author" content="(.*?)"/>',html)[0]

接下来我们就需要将每一章小说的链接拿出来了,我们通过浏览器中F12工具

  1. 点击左上角的箭头
  2. 点击我们需要定位的元素,我们需要找到每一章的链接,所以我们点击“正文 第一章”
  3. 我们就可以看到开发者工具中出现了对象在html中的位置

分析链接的位置我们发现都是在“<div id="list"></div>”这个div标签中间,然后每个链接都是在href后面。那我们先将这个div标签中的内容取出来然后对取出的内容找到所有的href标签中的链接放在一个列表中。

dl =re.findall(r'<div id="list">.*?</div>',html,re.S)[0]
chapter_info_list=re.findall(r'<a href="(.*?)">(.*?)</a>',dl)

这样我们就拿到了所有的章节列表,现在我们需要考虑如何去获取每一章节的内容。我们将首页的URL和每一个章节的链接进行拼接。

chapter_url = url+'/'+chapter_url
chapter_url = chapter_url.replace(' ','')

然后我们同样通过requests库获取到章节内容的HTML文件

chapter_response = requests.get(chapter_url)
chapter_html = chapter_response.text

通过同样的方式,我们发现正文的内容都是在“<div id="content"></div>”这样一个div标签中

我们将这个div标签中的正文内容全部拿出来

#获取第一页正文内容
chapter_content = re.findall(r'<div id="content">(.*?)</div>',chapter_html,re.S)[0]

我们将取出来的内容打印一下看看

我们发现还存在一些“<br />”和“&emsp;&emsp;”这样的元素,这些都是我们不希望看到的,那我们就通过replace函数给过滤掉。

chapter_content = chapter_content.replace('&emsp;&emsp;','')
chapter_content = chapter_content.replace('<br />','')

我们看看过滤后的内容

发现还是有些不对,为什么每一行文字都空了一行呢?我们通过debug看一下过程中的chapter_content内容

果然还存在一些制表符,那我们就只保留一个换行符“\n”

chapter_content = chapter_content.replace('\r\n\r', '')

这样我们就将这个页面的正文全部扒下来了,但我们翻到页面的末尾我们发现每章可能不仅仅一页,可能存在两页、三页甚至更多内容,怎么才能完整的将这不确定的内容拿下来呢?

我们看到在每一页的正文中都写明了这一章一共需要多少页,并且提供了下一页的链接,我们就通过这个线索来完成。

首先我们需要将总共的页数和下一页的链接取出来。

chapter_url,current_page,total_pages = re.findall(r'本章未完,请点击<a style="color:red;" href="(.*?)">下一页</a>继续阅读!第(.*?)页 / 共(.*?)页</p>', chapter_content,re.S)[0]

然后我们利用一个for循环去取内容,取的方式和前面类似,就不再详细描述了,直接上代码。

for i in range(1,int(total_pages)):
chapter_url,current_page,total_pages = re.findall(r'本章未完,请点击<a style="color:red;" href="(.*?)">下一页</a>继续阅读!第(.*?)页 / 共(.*?)页</p>',chapter_content)[0]
chapter_url = url+'/'+chapter_url
chapter_url = chapter_url.replace(' ','')
chapter_response = requests.get(chapter_url)
chapter_html =chapter_response.text
chapter_content = re.findall(r'<div id="content">(.*?)</div>', chapter_html, re.S)[0]
chapter_content = chapter_content.replace('&emsp;&emsp;', '')
chapter_content = chapter_content.replace('<br />', '')
chapter_content = chapter_content.replace('\r\n\r', '')
f.write('\n')
f.write(chapter_content)

最后我们只需要在外面加一个文件写入操作,将每一次读出的正文内容写入进去就好了。

with open('%s.txt'%title,'w') as f:
f.write(title)
f.write('\n')
f.write(author)
f.write('\n')

list index out of range报错的处理

看着是一切都完成了,可是在我最后来下载的时候,经常在不同的章节出现这样的错误。

这一次可能是在第四章出现问题,下一个可能是在第十章出现问题,总之不固定。我查询了一下这种错误一般会有两种情况

  1. list[index]index超出范围
  2. list是一个空的,没有一个元素,进行list[0]就会出现错误!

虽说查询到了原因,这两种情况都不能应该出现随机章节出现报错呀,我还是没有找到原因,如果有大神看到了可以指定一二。

但是我找到一个规避的措施,就是既然它是随机章节报错,那就是我一旦检测到报错之后就再重新请求一次url,重新通过正则校验一次。为此我拎出来一个这样的函数。

def find(pattern,string,url):
try:
chapter_content = re.findall(pattern, string, re.S)[0]
return chapter_content
except Exception as e:
print(e)
time.sleep(1)
chapter_response = requests.get(url) chapter_html = chapter_response.text
print(chapter_html)
print(url)
i = find(pattern,chapter_html,url)
return i

执行之后果然可行,我一直执行着,现在已经下载了一百多章了

现在看来唯一的缺点就是有点慢,原谅菜鸟小白还没有怎么弄过多线程和多进程,下次我们再来改进吧。

详细记录了python爬取小说《元尊》的整个过程,看了你必会~的更多相关文章

  1. 用Python爬取小说《一念永恒》

    我们首先选定从笔趣看网站爬取这本小说. 然后开始分析网页构造,这些与以前的分析过程大同小异,就不再多叙述了,只需要找到几个关键的标签和user-agent基本上就可以了. 那么下面,我们直接来看代码. ...

  2. python爬取小说详解(一)

    整理思路: 首先观察我们要爬取的页面信息.如下:  自此我们获得信息有如下: ♦1.小说名称链接小说内容的一个url,url的形式是:http://www.365haoshu.com/Book/Cha ...

  3. 用python爬取小说章节内容

    在学爬虫之前, 最好有一些html基础, 才能更好的分析网页. 主要是五步: 1.  获取链接 2. 正则匹配 3. 获取内容 4. 处理内容 5. 写入文件 代码如下: #导入相关model fro ...

  4. python爬取小说

    运行结果: 代码: import requests from bs4 import BeautifulSoup from selenium import webdriver import os cla ...

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

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

  6. Python3爬取小说并保存到文件

    问题 python课上,老师给同学们布置了一个问题,因为这节课上学的是正则表达式,所以要求利用python爬取小说网的任意小说并保存到文件. 我选的网站的URL是'https://www.biquka ...

  7. Python实战项目网络爬虫 之 爬取小说吧小说正文

    本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...

  8. python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)

    转载出处:药少敏   ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: from bs4 import BeautifulSoup imp ...

  9. python之爬取小说

    继上一篇爬取小说一念之间的第一章,这里将进一步展示如何爬取整篇小说 # -*- coding: utf- -*- import urllib.request import bs4 import re ...

随机推荐

  1. 普通平衡树学习笔记之Splay算法

    前言 今天不容易有一天的自由学习时间,当然要用来"学习".在此记录一下今天学到的最基础的平衡树. 定义 平衡树是二叉搜索树和堆合并构成的数据结构,它是一 棵空树或它的左右两个子树的 ...

  2. [BSidesCF 2020]Had a bad day

    [BSidesCF 2020]Had a bad day 测试 一些猫狗的图片加上url有传参,测试到文件包含时报错了. 使用php伪协议: php伪协议 php://fliter/read=conv ...

  3. java 面向对象(十):关键字:this

    1.可以调用的结构:属性.方法:构造器2.this调用属性.方法:this理解为:当前对象 或 当前正在创建的对象 2.1 在类的方法中,我们可以使用"this.属性"或" ...

  4. 数据可视化之powerBI技巧(二十二)利用这个方法,帮你搞定Power BI"增量刷新"

    Power BI的增量刷新功能现在已经对Pro用户开通,但由于种种限制,很多人依然无法使用无这个功能,所以,每一次刷新,都要彻底更新数据集.这对于量级比较大的数据集来说,着实是一件耗费时间的事情. 拿 ...

  5. bzoj3289Mato的文件管理

    bzoj3289Mato的文件管理 题意: 一共有n份资料,每天随机选一个区间[l,r],Mato按文件从小到大的顺序看编号在此区间内的这些资料.他先把要看的文件按编号顺序依次拷贝出来,再用排序程序给 ...

  6. HLS的M3U8文件介绍

    HLS的M3U8文件介绍 HLS (HTTP Live Streaming)是Apple的动态码率自适应技术.主要用于PC和Apple终端的音视频服务. 相较于实时传输协议(RTP),HLS可以穿过任 ...

  7. 聊聊Mysql主从同步读写分离配置实现

    Hi,各位热爱技术的小伙伴您们好,好久没有写点东西了,今天写点关于mysql主从同步配置的操作日志同大家一起分享.最近自己在全新搭建一个mysql主从同步读写分离数据库简单集群,我讲实际操作步骤整理分 ...

  8. CSS3伪类 :empty

    :empty 种类:伪类选择器 版本:CSS3.0 用法:匹配每个没有子元素(包含文本)的元素. 例子: <!DOCTYPE html> <html> <head> ...

  9. 数据结构 | 30行代码,手把手带你实现Trie树

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第28篇文章,我们一起来聊聊一个经典的字符串处理数据结构--Trie. 在之前的4篇文章当中我们介绍了关于博弈论的 ...

  10. 详解TCP一:三次握手、四次挥手

    TCP协议同样是运输层的协议,掌握TCP重点要关注这几个问题:顺序问题.丢包问题.连接维护.流量控制.拥塞控制.先解析下TCP报文段结构,相比于UDP要复杂很多. 首先还是两个端口号,对应着具体的应用 ...