目錄
前言
開始
分析(x0)
分析(x1)
分析(x2)
分析(x3)
分析(x4)
完整的代碼
我有話說
前言
大家好我叫善念,這是我的第二篇技術博文(第一篇講述的是自己的經歷),連續三天更新了,每天花兩小時寫下一個實戰案例,我也是樂在其中,謝謝大家對我的支持。
今天咱們要做的是利用Python爬取整個網站上的所有小說內容,其實在我心里面,采集什么內容根本無關緊要,最重要的是大家能學習到我的分析思路,授人以魚不如授人以漁。
開始
既然是要采集整站數據,那么我們進入目標網站,點擊全部作品。
分析(x0)
第一步右鍵一下查看網站源代碼,看里面是否有咱們需要的書本源頭文件地址(當然是看源頭文件地址,因為一本書的內容這么大,然后一頁有這么多本書,肯定不可能內容全部在源代碼中)。
可以看到我在元素中可以找到書的名字和介紹,然后關鍵的是一個跳轉的網址,這個網址很關鍵,因為咱們點擊這個鏈接后他會跳到單本小說中。
而單本小說里面勢必會有章節分類,而我們要做的肯定是需要把每本小說的章節名字也采集下來。
最終的目的就是,每本小說為一個文件夾,以書的名字命名,然后文件夾內保存所有章節,每一個章節為一個txt文檔,沒一個章節名與txt文件名對應。
分析(x1)
反轉,切記不要以element作為源代碼去考慮問題!!element可能是瀏覽器執行了一些JavaScript后所展現的源碼,與服務器傳給瀏覽器的源代碼是有所不同的。
所以咱們還是需要在源代碼中找一找是否有跳轉鏈接和書名。
好吧,源代碼中也是有的。不過你們不能大意,一定要查看源代碼中是否有,element代表不了源代碼。
那么先采集一下第一頁的書名和跳轉鏈接咯
``` 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 學習Python中有不明白推薦加入交流Q群號:928946953 群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF! 還有大牛解答! ``` # 抓取第一頁的所有書籍名字,書籍入口 # 到了書籍入口后,抓取章節名字,章節鏈接(文字內容) # 保存 import requests from lxml import etree import os url='https://www.qidian.com/all' req = requests.get(url).text html = etree.HTML(req) booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()') tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') for bookname, tzurl in zip(booknames, tzurls): if not os.path.exists(bookname): # if os.path.exists(bookname) == False: os.mkdir(bookname) # 創建文件夾
這里對應着咱們的思路,每采集到一個書名就給它單獨創建一個文件夾。
完全沒問題,到這里咱們已經完成第一步了。
分析(x2)
那么接下來就是去模擬請求咱們采集到的書本目錄的跳轉鏈接,然后同樣的方法去采集到章節名與章節內容的跳轉鏈接了。
同樣的你們自己查看下源代碼,數據也是在里面的。
那就接着寫代碼咯
``` 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 學習Python中有不明白推薦加入交流Q群號:928946953 群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF! 還有大牛解答! ``` import requests from lxml import etree import os url = 'https://www.qidian.com/all' req = requests.get(url).text html = etree.HTML(req) booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()') tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') for bookname, tzurl in zip(booknames, tzurls): if not os.path.exists(bookname): # if os.path.exists(bookname) == False: os.mkdir(bookname) # 創建文件夾 req2 = requests.get("http:" + tzurl).text html1 = etree.HTML(req2) zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href') zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()') for zjurl, zjname in zip(zjurls, zjnames): print(zjname+'\n'+zjurl)
效果圖:
分析(x3)
知道這里為什么沒有去把章節名字命名的txt文檔保存在文件夾內嗎?
因為咱們還沒有獲取到章節的內容呀,是不是需要先把章節內容寫到章節的txt里面,然后再保存在文件夾內?
當然這句解釋是為了照顧新手。
那么接下來采集章節內容,方法什么的不講了, 一模一樣的,章節內容同樣在源代碼中如上上圖所示。
每一個標簽只保存一行內容,那么就需要用到把采集到的所有內容都組合起來,並用換行符隔開,盡量保持文章格式。
代碼走起:
``` 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 學習Python中有不明白推薦加入交流Q群號:928946953 群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF! 還有大牛解答! ``` import requests from lxml import etree import os url = 'https://www.qidian.com/all' req = requests.get(url).text html = etree.HTML(req) booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()') tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') for bookname, tzurl in zip(booknames, tzurls): if not os.path.exists(bookname): # if os.path.exists(bookname) == False: os.mkdir(bookname) # 創建文件夾 req2 = requests.get("http:" + tzurl).text html1 = etree.HTML(req2) zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href') zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()') for zjurl, zjname in zip(zjurls, zjnames): print(zjname+'\n'+zjurl) req3 = requests.get('http:' + zjurl).text html2 = etree.HTML(req3) nrs = html2.xpath('//div[@class="read-content j_readContent"]/p/text()') # 分散式內容 nr = '\n'.join(nrs) file_name = bookname + "\\" + zjname + ".txt" print("正在抓取文章:" + file_name) with open(file_name, 'a', encoding="utf-8") as f: f.write(nr)
效果圖:
這里要說明一下,咱們還只是抓取了第一頁的數據。那么如何抓取整站的數據呢?
分析(x4)
一般稍微有經驗的都知道一點,就是當我們翻頁的時候,網站的url會發生變化,頁碼一般就是在url上面。
構建個for循環把頁碼數變為一個變量即可,無需多言,直接上最終的完整代碼,代碼僅供參考,你們最終可以自己去修改效果。
完整的代碼
``` 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 學習Python中有不明白推薦加入交流Q群號:928946953 群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF! 還有大牛解答! ``` import sys import requests from lxml import etree import os for i in range(sys.maxsize): url = f'https://www.qidian.com/all/page{i}/' req = requests.get(url).text html = etree.HTML(req) booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()') tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') for bookname, tzurl in zip(booknames, tzurls): if not os.path.exists(bookname): # if os.path.exists(bookname) == False: os.mkdir(bookname) # 創建文件夾 req2 = requests.get("http:" + tzurl).text html1 = etree.HTML(req2) zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href') zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()') for zjurl, zjname in zip(zjurls, zjnames): print(zjname+'\n'+zjurl) req3 = requests.get('http:' + zjurl).text html2 = etree.HTML(req3) nrs = html2.xpath('//div[@class="read-content j_readContent"]/p/text()') # 分散式內容 nr = '\n'.join(nrs) file_name = bookname + "\\" + zjname + ".txt" print("正在抓取文章:" + file_name) with open(file_name, 'a', encoding="utf-8") as f: f.write(nr)
我有話說
——女朋友就是私有變量,只有我這個類才能調用(紀念分手的第二周
emmm本來以前是錄制過視頻教程的,但是由於從上家公司離職后丟失了。在這里跟大伙說聲抱歉。
但是文章的話是現寫的,每篇文章我都會說得很細致,所以花費的時間比較久,一般都是兩個小時以上,每篇文章達到五千字左右。
原創不易,再次謝謝大家的支持。
① 2000多本Python電子書(主流和經典的書籍應該都有了)
② Python標准庫資料(最全中文版)
③ 項目源碼(四五十個有趣且經典的練手項目及源碼)
④ Python基礎入門、爬蟲、web開發、大數據分析方面的視頻(適合小白學習)
⑤ Python學習路線圖(告別不入流的學習)
``` 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 學習Python中有不明白推薦加入交流Q群號:928946953 群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF! 還有大牛解答! ```
