戰(zhàn):20分鐘下載《詭秘之主》全本)
一、前言通常而言, 被稱作網(wǎng)路爬蟲所爬取的事物, 大致上也就是這四種, 分別是文字, 還有圖片, 以及音樂, 再就是視頻。這是在明面上, 所能想到的事物, 除開這些內(nèi)容以外, 還存在一些危險(xiǎn)性質(zhì)的操施作辦, 是著實(shí)容易因而被請(qǐng)去喝茶的, 對(duì)此現(xiàn)暫且不予討論了。咱們循序漸進(jìn)先談?wù)勅绾蜗螺d文字內(nèi)容。PS文中出現(xiàn)的所有代碼均可在我的 上下載點(diǎn)擊查看二、詭秘之主說(shuō)到下載文字內(nèi)容第一個(gè)想到的就是下載小說(shuō)了。在曾以《一念永恒》這部小說(shuō)當(dāng)作例子來(lái)開展講解的CSDN之文章里, 存在網(wǎng)友留言稱:那么今天我就再安利一本小說(shuō)《詭秘之主》。起點(diǎn)中文網(wǎng)它的月票基本是月月第一。這篇文章實(shí)際上是在傳授眾人怎樣能夠不花錢而獲取, 然而具備支持正版能力的友人, 還是能夠前往起點(diǎn)中文網(wǎng), 去對(duì)作者予以支持的, 畢竟創(chuàng)作是不容易的。三、準(zhǔn)備工作話不多說(shuō)直接進(jìn)入我們今天的正題網(wǎng)絡(luò)小說(shuō)下載。1、背景介紹小說(shuō)網(wǎng)站“新筆趣閣”好多是盜版小說(shuō)網(wǎng)站, 以前爬過(guò)“筆趣看”, 這次咱換一家, 去爬“新筆趣閣”, 要雨露均沾呀“新筆趣閣”僅能在線瀏覽, 無(wú)法進(jìn)行小說(shuō)打包下載。此次實(shí)戰(zhàn)會(huì)教大家怎樣“優(yōu)雅”地去下載一篇名為《詭秘之主》的網(wǎng)絡(luò)小說(shuō)。2、爬蟲步驟要想把大象裝冰箱總共分幾步要想爬取數(shù)據(jù)總共分幾步爬蟲其實(shí)很簡(jiǎn)單可以大致分為三個(gè)步驟發(fā)起請(qǐng)求我們就用 就行上篇文章已經(jīng)介紹過(guò)。進(jìn)行解析數(shù)據(jù)的工具存在著許多, 舉例來(lái)說(shuō), 像是xpath這樣的, 還有Soup這種的, 以及正則表達(dá)式這類的等等。在本文當(dāng)中, 將會(huì)運(yùn)用一個(gè)具備簡(jiǎn)單特性的經(jīng)典小型工具, 也就是Soup來(lái)開展數(shù)據(jù)解析工作。保存數(shù)據(jù)就是常規(guī)的文本保存。3、 Soup簡(jiǎn)而言之, Soup屬于那種第三方庫(kù), 其主要的作用在于幫我們對(duì)網(wǎng)頁(yè)數(shù)據(jù)予以解析。在運(yùn)用該工具之前, 我們得先進(jìn)行安裝操作, 于 cmd 當(dāng)中, 借助 pip 或?qū)⑵浒惭b便可。pip install beautifulsoup4 # 或者 easy_install beautifulsoup4安裝完畢之后, 我們?nèi)耘f需要進(jìn)行 lxml 的安裝, 而這乃是解析 HTML 之時(shí)所必然要用到的依賴。pip install lxmlSoup的使用辦法同樣不復(fù)雜, 能夠瞧瞧我于CSDN的解說(shuō)或者官方教程去學(xué)習(xí), 具體的使用辦法:我的 Soup 講解點(diǎn)擊查看官方中文教程點(diǎn)擊查看四、小試牛刀我們先看下《詭秘之主》小說(shuō)的第一章內(nèi)容。URL先來(lái)嘗試一下, 運(yùn)用我們已然學(xué)到的知識(shí), 去獲取 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)這也就是爬蟲的第一步“發(fā)起請(qǐng)求”得到的結(jié)果如下能看到, 我們極為輕易地取得了 HTML 信息, 其中存在我們所期望的小說(shuō)正文部分, 可其同時(shí)也涵蓋了一些其余內(nèi)容, 而div、br 這些 HTML 標(biāo)簽, 我們并非予以關(guān)注。如何把正文內(nèi)容從這些眾多的 HTML 標(biāo)簽中提取出來(lái)呢這便要求開展爬蟲中的第二步“解析數(shù)據(jù)”, 此步驟具體而言就是運(yùn)用Soup著手進(jìn)行解析。此刻, 咱們運(yùn)用上篇文章所闡述的審查元素辦法, 去查看一番我們的目標(biāo)頁(yè)面, 你能夠看到如下這般的內(nèi)容:很難察覺不到, 文章里的全部?jī)?nèi)容都被放置于一個(gè)稱作div的“那邊之下”, 這個(gè)“處子”便是HTML標(biāo)簽, HTML標(biāo)簽屬于HTML語(yǔ)言里最為基礎(chǔ)的單元, HTML標(biāo)簽是HTML最為關(guān)鍵的構(gòu)成部分, 不明白, 沒什么關(guān)系, 我們?cè)倭信e一個(gè)簡(jiǎn)易的事例:會(huì)將諸多東西放置于包內(nèi)的女人, 會(huì)依據(jù)個(gè)人習(xí)慣來(lái)分類擱放親手之物。鏡子、口紅等常用之物, 會(huì)被歸置到易于拿取的外側(cè)口袋。證件這類不常使用且需留神安全存放之物, 則會(huì)被安置在不易拿到的里側(cè)口袋。HTML標(biāo)簽如同一個(gè)個(gè) “口袋”, 每個(gè) “口袋” 具備自身特定功能, 負(fù)責(zé)放置不同內(nèi)容。顯然, 上述例子里的div標(biāo)簽下放置了我們所關(guān)心的正文內(nèi)容。這個(gè)div標(biāo)簽是如此這般的:可能細(xì)心的朋友已然發(fā)現(xiàn), 除了div字樣之外, 還有id。id屬于div標(biāo)簽的屬性, 是屬性值而言, 一個(gè)屬性會(huì)對(duì)應(yīng)著一個(gè)屬性值。用什么來(lái)區(qū)分眾多的div標(biāo)簽, 是屬性, 它有什么作用, 因?yàn)閐iv標(biāo)簽數(shù)量眾多, id可被看作是此div的身份。存在這樣一個(gè)div標(biāo)簽, 其id屬性既定, 在這個(gè)div標(biāo)簽里頭, 所存放的正是我們期望獲取的內(nèi)容, 憑借這一方面, 我們能夠借助Soup去提取我們所需要的正文內(nèi)容, 代碼編寫情況如下: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)代碼稱得上簡(jiǎn)單至極, bf.find(div, id)所具備的意思乃為, 尋得那有著id屬性為的div標(biāo)簽語(yǔ)句。能夠發(fā)現(xiàn), 正文部分的內(nèi)容已然順利地被提取出來(lái), 然而其中仍然存在一些諸如div以及br這樣類型的標(biāo)簽, 我們需要進(jìn)行進(jìn)一步的數(shù)據(jù)清洗這項(xiàng)操作。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 提取全部文字, 接著運(yùn)用 strip 方法去除回車, 隨后借助 split 方法依據(jù)\xa0 切分?jǐn)?shù)據(jù), 此為因每一段開頭皆存在四個(gè)空格。程序運(yùn)行結(jié)果如下所有的內(nèi)容已經(jīng)清洗干凈保存到一個(gè)列表里了。小說(shuō)正文, 已然順利獲取到手了。若要下載整部小說(shuō), 我們就得獲取每一個(gè)章節(jié)的鏈接。我們先針對(duì)小說(shuō)目錄予以分析:URL經(jīng)過(guò)審查元素的操作之后, 我們并非難以發(fā)覺, 所有那些章節(jié)方面的信息, 全都被存放于了有著id屬性為list的div標(biāo)簽下面的a標(biāo)簽內(nèi)部, 進(jìn)而編寫像下面這樣的代碼: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 屬性設(shè)定為 list 的 div 標(biāo)簽, 將.(a) 理解為于尋得的 div 標(biāo)簽之中, 再度去提取出全部的 a 標(biāo)簽, 進(jìn)而能夠得出如下這般的運(yùn)行結(jié)果:能夠看到, 章節(jié)鏈接以及章節(jié)名, 我們已然提取出來(lái), 然而, 還需要作進(jìn)一步的解析, 編寫像下面這樣的代碼: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 屬性, 且以此拼接成了章節(jié)的url, 運(yùn)用.方法提取出了章節(jié)名。存在著每個(gè)章節(jié)的鏈接, 有著章節(jié)名, 具備了章節(jié)內(nèi)容。接下來(lái)所要著手進(jìn)行的事情便是整合代碼, 把內(nèi)容保存到txt這個(gè)文件里面即可。然后編寫的代碼如下: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)在下載的進(jìn)程當(dāng)中, 我們借助了 tqdm 來(lái)展現(xiàn)下載的進(jìn)度情況, 從而使下載過(guò)程具備了更為像那么回事兒且令人看著舒坦的特質(zhì), 要是尚未裝 tqdm 的話, 可以采用 pip 去完成安裝, 其運(yùn)行所呈現(xiàn)出來(lái)的效果是:能瞧見, 小說(shuō)的內(nèi)容被存進(jìn)了“詭秘之主.txt”里頭, 這本小說(shuō)擁有總共 1416 章, 其下載所需時(shí)間大概是 20 分鐘, 并且每秒大約能下載 1 個(gè)章節(jié)。下載完成實(shí)際花費(fèi)了 27 分鐘。二十多分鐘去下載一本小說(shuō), 你或許會(huì)覺得速度太慢了。要是想提升速度, 能夠運(yùn)用多進(jìn)程, 從而大幅加快下載速度。要是采用分布式, 甚至能夠在一秒鐘之內(nèi)就完成下載。但是我不建議這樣做。我們需成為一個(gè)友善的爬蟲, 若我們進(jìn)行提速, 那我們所訪問(wèn)的服務(wù)器便會(huì)面臨更大的壓力。拿我們此次下載小說(shuō)的代碼當(dāng)作例子, 每一秒鐘會(huì)下載 1篇章節(jié)目錄, 服務(wù)器所承受的壓力大概是 1qps, 其意思是, 在這一秒鐘里會(huì)進(jìn)行1次請(qǐng)求。要是在 1 秒的時(shí)間里, 我們同時(shí)進(jìn)行 1416 個(gè)章節(jié)的下載操作, 那么服務(wù)器就會(huì)承受大概 1416 qps 的壓力, 而這還僅僅只是你所發(fā)出的并發(fā)請(qǐng)求數(shù)量, 要是再把其他用戶的請(qǐng)求加算進(jìn)去, 并發(fā)量或許會(huì)更多。要是服務(wù)器出現(xiàn)資源不足的狀況, 這般的并發(fā)量能夠在瞬間把服務(wù)器給“弄死”, 尤其是某些小網(wǎng)站, 通通都很脆弱。擁有過(guò)大并發(fā)量的爬蟲程序, 這等同于發(fā)起了一場(chǎng) CC 攻擊, 并非所有網(wǎng)站都有著承受百萬(wàn)級(jí)別并發(fā)量這種能力存在的。所以, 去寫爬蟲的時(shí)候, 必須一定要無(wú)比小心謹(jǐn)慎, 千萬(wàn)不要給服務(wù)器增添過(guò)多的壓力 , 要達(dá)成滿足我們獲取數(shù)據(jù)的需求這樣的情況 , 這就足夠。你好我也好大家好才是真的好。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