目錄
前言
開始
分析(x0)
分析(x1)
分析(x2)
分析(x3)
分析(x4)
完整的代碼
我有話說
大家好我叫善念,這是我的第二篇技術博文(第一篇講述的是自己的經曆),連續三天更新了,每天花兩小時寫下一個實戰案例,我也是樂在其中,謝謝大家對我的支援。
今天咱們要做的是利用Python爬取整個網站上的所有小說内容,其實在我心裡面,采集什麼内容根本無關緊要,最重要的是大家能學習到我的分析思路,授人以魚不如授人以漁。
既然是要采集整站資料,那麼我們進入目标網站,點選全部作品。

可以看到我在元素中可以找到書的名字和介紹,然後關鍵的是一個跳轉的網址,這個網址很關鍵,因為咱們點選這個連結後他會跳到單本小說中。
而單本小說裡面勢必會有章節分類,而我們要做的肯定是需要把每本小說的章節名字也采集下來。
最終的目的就是,每本小說為一個檔案夾,以書的名字命名,然後檔案夾内儲存所有章節,每一個章節為一個txt文檔,沒一個章節名與txt檔案名對應。
反轉,切記不要以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) # 建立檔案夾
這裡對應着咱們的思路,每采集到一個書名就給它單獨建立一個檔案夾。
完全沒問題,到這裡咱們已經完成第一步了。
那麼接下來就是去模拟請求咱們采集到的書本目錄的跳轉連結,然後同樣的方法去采集到章節名與章節内容的跳轉連結了。
同樣的你們自己檢視下源代碼,資料也是在裡面的。
那就接着寫代碼咯
```
當然在學習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)
效果圖:
知道這裡為什麼沒有去把章節名字命名的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)
這裡要說明一下,咱們還隻是抓取了第一頁的資料。那麼如何抓取整站的資料呢?
一般稍微有經驗的都知道一點,就是當我們翻頁的時候,網站的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! 還有大牛解答! ```