公司动态
爬虫实战:20分钟下载《诡秘之主》全本
一、前言通常而言, 被称作网路爬虫所爬取的事物, 大致上也就是这四种, 分别是文字, 还有图片, 以及音乐, 再就是视频。这是在明面上, 所能想到的事物, 除开这些内容以外, 还存在一些危险性质的操施作办, 是着实容易因而被请去喝茶的, 对此现暂且不予讨论了。咱们循序渐进先谈谈如何下载文字内容。PS文中出现的所有代码均可在我的 上下载点击查看二、诡秘之主说到下载文字内容第一个想到的就是下载小说了。在曾以《一念永恒》这部小说当作例子来开展讲解的CSDN之文章里, 存在网友留言称:那么今天我就再安利一本小说《诡秘之主》。起点中文网它的月票基本是月月第一。这篇文章实际上是在传授众人怎样能够不花钱而获取, 然而具备支持正版能力的友人, 还是能够前往起点中文网, 去对作者予以支持的, 毕竟创作是不容易的。三、准备工作话不多说直接进入我们今天的正题网络小说下载。1、背景介绍小说网站“新笔趣阁”好多是盗版小说网站, 以前爬过“笔趣看”, 这次咱换一家, 去爬“新笔趣阁”, 要雨露均沾呀“新笔趣阁”仅能在线浏览, 无法进行小说打包下载。此次实战会教大家怎样“优雅”地去下载一篇名为《诡秘之主》的网络小说。2、爬虫步骤要想把大象装冰箱总共分几步要想爬取数据总共分几步爬虫其实很简单可以大致分为三个步骤发起请求我们就用 就行上篇文章已经介绍过。进行解析数据的工具存在着许多, 举例来说, 像是xpath这样的, 还有Soup这种的, 以及正则表达式这类的等等。在本文当中, 将会运用一个具备简单特性的经典小型工具, 也就是Soup来开展数据解析工作。保存数据就是常规的文本保存。3、 Soup简而言之, Soup属于那种第三方库, 其主要的作用在于帮我们对网页数据予以解析。在运用该工具之前, 我们得先进行安装操作, 于 cmd 当中, 借助 pip 或将其安装便可。pip install beautifulsoup4 # 或者 easy_install beautifulsoup4安装完毕之后, 我们仍旧需要进行 lxml 的安装, 而这乃是解析 HTML 之时所必然要用到的依赖。pip install lxmlSoup的使用办法同样不复杂, 能够瞧瞧我于CSDN的解说或者官方教程去学习, 具体的使用办法:我的 Soup 讲解点击查看官方中文教程点击查看四、小试牛刀我们先看下《诡秘之主》小说的第一章内容。URL先来尝试一下, 运用我们已然学到的知识, 去获取 HTML 信息, 代码编写如下:import requests if __name__ __main__: target https://www.xsbiquge.com/15_15338/8549128.html req requests.get(url target) req.encoding utf-8 print(req.text)这也就是爬虫的第一步“发起请求”得到的结果如下能看到, 我们极为轻易地取得了 HTML 信息, 其中存在我们所期望的小说正文部分, 可其同时也涵盖了一些其余内容, 而div、br 这些 HTML 标签, 我们并非予以关注。如何把正文内容从这些众多的 HTML 标签中提取出来呢这便要求开展爬虫中的第二步“解析数据”, 此步骤具体而言就是运用Soup着手进行解析。此刻, 咱们运用上篇文章所阐述的审查元素办法, 去查看一番我们的目标页面, 你能够看到如下这般的内容:很难察觉不到, 文章里的全部内容都被放置于一个称作div的“那边之下”, 这个“处子”便是HTML标签, HTML标签属于HTML语言里最为基础的单元, HTML标签是HTML最为关键的构成部分, 不明白, 没什么关系, 我们再列举一个简易的事例:会将诸多东西放置于包内的女人, 会依据个人习惯来分类搁放亲手之物。镜子、口红等常用之物, 会被归置到易于拿取的外侧口袋。证件这类不常使用且需留神安全存放之物, 则会被安置在不易拿到的里侧口袋。HTML标签如同一个个 “口袋”, 每个 “口袋” 具备自身特定功能, 负责放置不同内容。显然, 上述例子里的div标签下放置了我们所关心的正文内容。这个div标签是如此这般的:可能细心的朋友已然发现, 除了div字样之外, 还有id。id属于div标签的属性, 是属性值而言, 一个属性会对应着一个属性值。用什么来区分众多的div标签, 是属性, 它有什么作用, 因为div标签数量众多, id可被看作是此div的身份。存在这样一个div标签, 其id属性既定, 在这个div标签里头, 所存放的正是我们期望获取的内容, 凭借这一方面, 我们能够借助Soup去提取我们所需要的正文内容, 代码编写情况如下:import requests from bs4 import BeautifulSoup if __name__ __main__: target https://www.xsbiquge.com/15_15338/8549128.html req requests.get(url target) req.encoding utf-8 html req.text bs BeautifulSoup(html, lxml) texts bs.find(div, idcontent) print(texts)代码称得上简单至极, bf.find(div, id)所具备的意思乃为, 寻得那有着id属性为的div标签语句。能够发现, 正文部分的内容已然顺利地被提取出来, 然而其中仍然存在一些诸如div以及br这样类型的标签, 我们需要进行进一步的数据清洗这项操作。import requests from bs4 import BeautifulSoup if __name__ __main__: target https://www.xsbiquge.com/15_15338/8549128.html req requests.get(url target) req.encoding utf-8 html req.text bs BeautifulSoup(html, lxml) texts bs.find(div, idcontent) print(texts.text.strip().split(\xa0*4))首先采用 texts.text 提取全部文字, 接着运用 strip 方法去除回车, 随后借助 split 方法依据\xa0 切分数据, 此为因每一段开头皆存在四个空格。程序运行结果如下所有的内容已经清洗干净保存到一个列表里了。小说正文, 已然顺利获取到手了。若要下载整部小说, 我们就得获取每一个章节的链接。我们先针对小说目录予以分析:URL经过审查元素的操作之后, 我们并非难以发觉, 所有那些章节方面的信息, 全都被存放于了有着id属性为list的div标签下面的a标签内部, 进而编写像下面这样的代码:import requests from bs4 import BeautifulSoup if __name__ __main__: target https://www.xsbiquge.com/15_15338/ req requests.get(url target) req.encoding utf-8 html req.text bs BeautifulSoup(html, lxml) chapters bs.find(div, idlist) chapters chapters.find_all(a) for chapter in chapters: print(chapter)将 bf.find(div, idlist) 理解为去寻觅那 id 属性设定为 list 的 div 标签, 将.(a) 理解为于寻得的 div 标签之中, 再度去提取出全部的 a 标签, 进而能够得出如下这般的运行结果:能够看到, 章节链接以及章节名, 我们已然提取出来, 然而, 还需要作进一步的解析, 编写像下面这样的代码:import requests from bs4 import BeautifulSoup if __name__ __main__: server https://www.xsbiquge.com target https://www.xsbiquge.com/15_15338/ req requests.get(url target) req.encoding utf-8 html req.text bs BeautifulSoup(html, lxml) chapters bs.find(div, idlist) chapters chapters.find_all(a) for chapter in chapters: url chapter.get(href) print(chapter.string) print(server url)能够瞧见, .get(‘href’)法子提取出了href 属性, 且以此拼接成了章节的url, 运用.方法提取出了章节名。存在着每个章节的链接, 有着章节名, 具备了章节内容。接下来所要着手进行的事情便是整合代码, 把内容保存到txt这个文件里面即可。然后编写的代码如下:import requests import time from tqdm import tqdm from bs4 import BeautifulSoup def get_content(target): req requests.get(url target) req.encoding utf-8 html req.text bf BeautifulSoup(html, lxml) texts bf.find(div, idcontent) content texts.text.strip().split(\xa0*4) return content if __name__ __main__: server https://www.xsbiquge.com book_name 诡秘之主.txt target https://www.xsbiquge.com/15_15338/ req requests.get(url target) req.encoding utf-8 html req.text chapter_bs BeautifulSoup(html, lxml) chapters chapter_bs.find(div, idlist) chapters chapters.find_all(a) for chapter in tqdm(chapters): chapter_name chapter.string url server chapter.get(href) content get_content(url) with open(book_name, a, encodingutf-8) as f: f.write(chapter_name) f.write(\n) f.write(\n.join(content)) f.write(\n)在下载的进程当中, 我们借助了 tqdm 来展现下载的进度情况, 从而使下载过程具备了更为像那么回事儿且令人看着舒坦的特质, 要是尚未装 tqdm 的话, 可以采用 pip 去完成安装, 其运行所呈现出来的效果是:能瞧见, 小说的内容被存进了“诡秘之主.txt”里头, 这本小说拥有总共 1416 章, 其下载所需时间大概是 20 分钟, 并且每秒大约能下载 1 个章节。下载完成实际花费了 27 分钟。二十多分钟去下载一本小说, 你或许会觉得速度太慢了。要是想提升速度, 能够运用多进程, 从而大幅加快下载速度。要是采用分布式, 甚至能够在一秒钟之内就完成下载。但是我不建议这样做。我们需成为一个友善的爬虫, 若我们进行提速, 那我们所访问的服务器便会面临更大的压力。拿我们此次下载小说的代码当作例子, 每一秒钟会下载 1篇章节目录, 服务器所承受的压力大概是 1qps, 其意思是, 在这一秒钟里会进行1次请求。要是在 1 秒的时间里, 我们同时进行 1416 个章节的下载操作, 那么服务器就会承受大概 1416 qps 的压力, 而这还仅仅只是你所发出的并发请求数量, 要是再把其他用户的请求加算进去, 并发量或许会更多。要是服务器出现资源不足的状况, 这般的并发量能够在瞬间把服务器给“弄死”, 尤其是某些小网站, 通通都很脆弱。拥有过大并发量的爬虫程序, 这等同于发起了一场 CC 攻击, 并非所有网站都有着承受百万级别并发量这种能力存在的。所以, 去写爬虫的时候, 必须一定要无比小心谨慎, 千万不要给服务器增添过多的压力 , 要达成满足我们获取数据的需求这样的情况 , 这就足够。你好我也好大家好才是真的好。zj9.WmoPh.cN5yb.WmoPh.cNik7.WmoPh.cNc29.WmoPh.cNjhm.WmoPh.cN6a7.WmoPh.cNoop.WmoPh.cN62y.WmoPh.cN8h4.WmoPh.cNqg7.WmoPh.cNa1t.WmoPh.cN3dm.WmoPh.cNuh5.WmoPh.cN4kd.WmoPh.cNy69.WmoPh.cNr9r.WmoPh.cNq7x.WmoPh.cNzny.WmoPh.cNrl5.WmoPh.cNsec.WmoPh.cNwv4.WmoPh.cNkix.WmoPh.cNctp.WmoPh.cNrd2.WmoPh.cN5pu.WmoPh.cN2xn.WmoPh.cNh7e.WmoPh.cN4y0.WmoPh.cNnvi.WmoPh.cNzxc.WmoPh.cNole.WmoPh.cNllc.WmoPh.cN8ci.WmoPh.cNcba.WmoPh.cNsdp.WmoPh.cN9b3.WmoPh.cNl0f.WmoPh.cN211.WmoPh.cNuj8.WmoPh.cNlqd.WmoPh.cNwxk.WmoPh.cNy2y.WmoPh.cNrvb.WmoPh.cNcli.WmoPh.cNg52.WmoPh.cNff3.WmoPh.cNmaj.WmoPh.cNkdn.WmoPh.cNhp0.WmoPh.cNi4b.WmoPh.cNkkk.WmoPh.cNf0b.WmoPh.cNci9.WmoPh.cNfwr.WmoPh.cNc45.WmoPh.cN908.WmoPh.cN0y6.WmoPh.cN1cj.WmoPh.cN2uo.WmoPh.cNvkp.WmoPh.cNd4n.WmoPh.cNyki.WmoPh.cN42d.WmoPh.cNp0i.WmoPh.cN51g.WmoPh.cNv47.WmoPh.cNugr.WmoPh.cN1dh.WmoPh.cNkdr.WmoPh.cN1xn.WmoPh.cNpey.WmoPh.cNgmo.WmoPh.cN91q.WmoPh.cNgoa.WmoPh.cNn5k.WmoPh.cNrsu.WmoPh.cNbb7.WmoPh.cNsqe.WmoPh.cNafl.WmoPh.cN8yl.WmoPh.cN7su.WmoPh.cNx09.WmoPh.cNecj.WmoPh.cN66t.WmoPh.cNwxt.WmoPh.cNbk6.WmoPh.cNgd2.WmoPh.cN6wj.WmoPh.cNhoi.WmoPh.cNr59.WmoPh.cN67u.WmoPh.cNfr4.WmoPh.cNsu7.WmoPh.cNcxg.WmoPh.cN1uy.WmoPh.cNxmh.WmoPh.cN2q9.WmoPh.cN31x.WmoPh.cN2rb.WmoPh.cNp3d.WmoPh.cNiim.WmoPh.cNd6z.WmoPh.cN7uj.WmoPh.cNh4h.WmoPh.cN0c4.WmoPh.cNwcp.WmoPh.cN8bw.WmoPh.cNoki.WmoPh.cN7wy.WmoPh.cNq8u.WmoPh.cNfdn.WmoPh.cN9l3.WmoPh.cNm7j.WmoPh.cNmj2.WmoPh.cNjpy.WmoPh.cNhfj.WmoPh.cN7vv.WmoPh.cNdzn.WmoPh.cNgo5.WmoPh.cNlng.WmoPh.cNm47.WmoPh.cNjkd.WmoPh.cNanh.WmoPh.cNxh4.WmoPh.cNdxr.WmoPh.cNt41.WmoPh.cN28t.WmoPh.cN3pn.WmoPh.cN7jg.WmoPh.cNed1.WmoPh.cNq1g.WmoPh.cNwt5.WmoPh.cNxbl.WmoPh.cN9ga.WmoPh.cN9ef.WmoPh.cNise.WmoPh.cNlg3.WmoPh.cNhe3.WmoPh.cNuic.WmoPh.cN2p1.WmoPh.cNn6y.WmoPh.cN303.WmoPh.cNlxh.WmoPh.cN6c0.WmoPh.cNsg7.WmoPh.cN63d.WmoPh.cNzov.WmoPh.cNs54.WmoPh.cN7gr.WmoPh.cNrbq.WmoPh.cNlxy.WmoPh.cNhrl.WmoPh.cNq3q.WmoPh.cN5h5.WmoPh.cNgpk.WmoPh.cN86d.WmoPh.cNaoa.WmoPh.cN293.WmoPh.cNjh1.WmoPh.cNi7g.WmoPh.cNi9t.WmoPh.cNt00.WmoPh.cNpew.WmoPh.cN3ym.WmoPh.cNedv.WmoPh.cNphq.WmoPh.cN4xf.WmoPh.cNzbj.WmoPh.cN02r.WmoPh.cNikh.WmoPh.cNk2t.WmoPh.cNtge.WmoPh.cNm06.WmoPh.cNhqy.WmoPh.cN3lp.WmoPh.cN490.WmoPh.cNzto.WmoPh.cN8vq.WmoPh.cNjn0.WmoPh.cNg98.WmoPh.cNiwu.WmoPh.cNem0.WmoPh.cNolf.WmoPh.cNq96.WmoPh.cNdi8.WmoPh.cNudj.WmoPh.cNzyz.WmoPh.cNrls.WmoPh.cNjy1.WmoPh.cNobf.WmoPh.cNjkn.WmoPh.cNqs9.WmoPh.cN9nm.WmoPh.cN7pw.WmoPh.cNoj5.WmoPh.cNpzw.WmoPh.cNn5j.WmoPh.cNr1k.WmoPh.cNqpd.WmoPh.cNjf7.WmoPh.cN6go.WmoPh.cN5yh.WmoPh.cNz7f.WmoPh.cN3lt.WmoPh.cNegg.WmoPh.cN579.WmoPh.cNqhz.WmoPh.cN8rr.WmoPh.cN8zv.WmoPh.cNhga.WmoPh.cN08m.WmoPh.cNbno.WmoPh.cNec8.WmoPh.cNxto.WmoPh.cN87k.WmoPh.cN4hd.WmoPh.cN3sf.WmoPh.cNows.WmoPh.cNnu4.WmoPh.cNh9p.WmoPh.cNhkq.WmoPh.cNhhm.WmoPh.cNmxn.WmoPh.cNbl3.WmoPh.cN7jm.WmoPh.cNx7b.WmoPh.cNy6x.WmoPh.cN90o.WmoPh.cN1j3.WmoPh.cNwsx.WmoPh.cNa0i.WmoPh.cNb6t.WmoPh.cNrdm.WmoPh.cNyz9.WmoPh.cN3b9.WmoPh.cN6ta.WmoPh.cNkdl.WmoPh.cNulg.WmoPh.cNh43.WmoPh.cN9qb.WmoPh.cN1k0.WmoPh.cNzs7.WmoPh.cNoai.WmoPh.cNqez.WmoPh.cN4ex.WmoPh.cNiy8.WmoPh.cNwqq.WmoPh.cN8ky.WmoPh.cNvw1.WmoPh.cNd4u.WmoPh.cNygx.WmoPh.cNa1g.WmoPh.cNnkw.WmoPh.cNf8z.WmoPh.cN61j.WmoPh.cN21c.WmoPh.cNz23.WmoPh.cNl4r.WmoPh.cNddp.WmoPh.cN4sk.WmoPh.cNbto.WmoPh.cN1h1.WmoPh.cN0ko.WmoPh.cNb7w.WmoPh.cNims.WmoPh.cN0cj.WmoPh.cNqzb.WmoPh.cNum5.WmoPh.cN6wu.WmoPh.cNd4j.WmoPh.cNrri.WmoPh.cNqdv.WmoPh.cNeu0.WmoPh.cNmc6.WmoPh.cNezs.WmoPh.cNbnf.WmoPh.cNdsx.WmoPh.cNqgz.WmoPh.cNl20.WmoPh.cNs4x.WmoPh.cNdcq.WmoPh.cN0dv.WmoPh.cNkgd.WmoPh.cN3u6.WmoPh.cNf41.WmoPh.cNpl9.WmoPh.cNqwm.WmoPh.cN6j2.WmoPh.cN4cc.WmoPh.cNv4b.WmoPh.cN90m.WmoPh.cNwpd.WmoPh.cN12k.WmoPh.cNhih.WmoPh.cNq17.WmoPh.cNe7l.WmoPh.cNb30.WmoPh.cN5uv.WmoPh.cNmlo.WmoPh.cN7ed.WmoPh.cNnnb.WmoPh.cNkvb.WmoPh.cNgqe.WmoPh.cNhgq.WmoPh.cNs6e.WmoPh.cNq07.WmoPh.cNo9d.WmoPh.cNp9g.WmoPh.cNzqm.WmoPh.cN7hp.WmoPh.cN6ji.WmoPh.cNzxg.WmoPh.cNfr7.WmoPh.cNj5c.WmoPh.cNd3n.WmoPh.cNd6k.WmoPh.cNy3z.WmoPh.cNdmu.WmoPh.cN5lk.WmoPh.cNck3.WmoPh.cNi2r.WmoPh.cNolh.WmoPh.cNe99.WmoPh.cN9wq.WmoPh.cN2of.WmoPh.cNt5k.WmoPh.cNee3.WmoPh.cNk0n.WmoPh.cNj5x.WmoPh.cNjrl.WmoPh.cN9u1.WmoPh.cNhhr.WmoPh.cNlhg.WmoPh.cNcyl.WmoPh.cNeyg.WmoPh.cN8pq.WmoPh.cNw6s.WmoPh.cN2m7.WmoPh.cNgwq.WmoPh.cNb4c.WmoPh.cN03n.WmoPh.cNfyt.WmoPh.cNgfu.WmoPh.cNyn8.WmoPh.cNj5u.WmoPh.cNjk4.WmoPh.cNy0x.WmoPh.cNoo7.WmoPh.cNbfd.WmoPh.cNpsb.WmoPh.cN8up.WmoPh.cN27c.WmoPh.cN2e0.WmoPh.cNc8i.WmoPh.cNpgx.WmoPh.cNh8g.WmoPh.cN1wc.WmoPh.cNdrl.WmoPh.cNpjz.WmoPh.cNtiy.WmoPh.cNcd3.WmoPh.cNrb4.WmoPh.cNkc2.WmoPh.cN9ii.WmoPh.cNrrw.WmoPh.cN59v.WmoPh.cNmn8.WmoPh.cNjv3.WmoPh.cNz4a.WmoPh.cNh6s.WmoPh.cNwdf.WmoPh.cN0vh.WmoPh.cN