专栏首页菜鸟小白的学习分享详细记录了python爬取小说《元尊》的整个过程,看了你必会~

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

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

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

相关库文件

我们使用的库有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')

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

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

  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

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

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

本文分享自微信公众号 - 菜鸟小白的学习分享(cainiao-xiaobai),作者:菜鸟小白的学习分享

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用 Python 抓网页,你想问的都帮答好了,你还有不懂的吗?

    近年来,随着大数据、人工智能、机器学习等技术的兴起,Python 语言也越来越为人们所喜爱。但早在这些技术普及之前,Python 就一直担负着一个重要的工作:自...

    一墨编程学习
  • 创建一个分布式网络爬虫的故事

    编者按:作者通过创建和扩展自己的分布式爬虫,介绍了一系列工具和架构, 包括分布式体系结构、扩展、爬虫礼仪、安全、调试工具、Python 中的多任务处理等。以下为...

    CSDN技术头条
  • 爬虫的"盗亦有道"-Robots协议

    网络爬虫的君子协议 ? 执着 网络爬虫的尺寸 小规模,数量小,爬去速度不敏感,requests库 中规模,数据规模较大,爬取速度敏感scrapy库 大规模...

    若与
  • Robots协议探究:如何好好利用爬虫提高网站权重

    站长们通常希望百度、Google 这样的大型搜索引擎来抓取网站内容,但又很厌恶其他来路不明的网络爬虫抓取自己的信息。

    德顺
  • Python3 网络爬虫(一):初识网络爬虫之夜探老王家(2020年最新版)

    网络爬虫,是一门比较通用的基础技术,各个领域都会有所涉及,比如我做视觉算法的,也需要用到网络爬虫,例如调用 API 接口清洗数据等,这本质也都是一个小的爬虫程序...

    Jack_Cui
  • Python网络爬虫---scrapy通用爬虫及反爬技巧

    爬取大量(一般来说是无限)的网站而不是特定的一些网站。 不会将整个网站都爬取完毕,因为这十分不实际(或者说是不可能)完成的。相反,其会限制爬取的时间及数量。

    一墨编程学习
  • Python3网络爬虫(十二):初识Scrapy之再续火影情缘

    版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 ...

    Jack_Cui
  • 爬取《The Hitchhiker’s Guide to Python!》python进阶书并制成pdf

    这是日常学python的第15篇原创文章 前几篇文章我们学习了requests库和正则,还有个urllib库,我上篇文章也用了requests库来教大家去爬那些...

    sergiojune
  • Python无头爬虫Selenium系列(01):像手工一样操作浏览器

    自动化爬虫虽然方便,但希望大家能顾及网站服务器的承受能力,不要高频率访问网站。并且千万不要采集敏感数据!!否则很容易"从入门到入狱"

    Excel催化剂
  • 【爬虫教程】吐血整理,最详细的爬虫入门教程~

    通俗来讲,假如你需要互联网上的信息,如商品价格,图片视频资源等,但你又不想或者不能自己一个一个自己去打开网页收集,这时候你便写了一个程序,让程序按照你指定好的规...

    Awesome_Tang
  • list python 访问 键值对_【小白指南】Python中有哪些数据类型?(附推文合集)...

    俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营在不久前已经圆满结束啦~应广大学员需求,我们的课...

    用户7886150
  • 测试Python爬虫极限,一天抓取100万张网页的酷炫操作!

    前一两年抓过某工商信息网站,几三周时间大约抓了过千万多万张页面。那时由于公司没啥经费,报销又拖得很久,不想花钱在很多机器和带宽上,所以当时花了较多精力研究如何让...

    一墨编程学习
  • 如何让爬虫一天抓取100万张网页

    爬虫这两年貌似成为了一项必备技能,无论是搞技术的,做产品的,数据分析的,金融的,初创公司做冷启动的,都想去抓点数据回来玩玩。这里面绝大多数一共都只抓几万或几十万...

    sergiojune
  • Python采集微博热评进行情感分析祝你狗年脱单

    如果自己需要爬(cai)虫(ji)的数据量比较大,为了防止被网站封Ip,可以分时段爬取,另外对于爬到的数据一般是用来存储数据库,这就需要对数据进行去重处理,记录...

    Python攻城狮
  • 爬虫实战--拿下最全租房数据 | 附源码

    上一篇的实战只是给大家作为一个练手,数据内容比较少,且官网也有对应的 API,难度不大。

    小一不二三
  • Python 爬虫:爬取小说花千骨

    知识就像碎布,记得“缝一缝”,你才能华丽丽地亮相。 1.Beautiful Soup 1.Beautifulsoup 简介 此次实战从网上爬取小说,需要使用到B...

    小小科
  • 【爬虫教程】最详细的爬虫入门教程~

    通俗来讲,假如你需要互联网上的信息,如商品价格,图片视频资源等,但你又不想或者不能自己一个一个自己去打开网页收集,这时候你便写了一个程序,让程序按照你指定好的规...

    Awesome_Tang
  • 在知乎上学 Python - 爬虫篇

    知乎是个好地方。虽然近年来,为了吸引更多的用户,知乎的定位与早期略有点偏离。但从内容质量和专业性来说,知乎仍然是国内数一数二的知识型社区。不少同学都是通过知乎发...

    Crossin先生
  • Python 实战(5):拿来主义

    有了列表,有了详细信息,有了搜索,这个电影网站已经有了基本的结构。现在要做的是:获取更多的内容。 我们没有必要也不可能自己去生产数量庞大的电影信息,互联网上的资...

    Crossin先生

扫码关注云+社区

领取腾讯云代金券