例項解析- 全書網
學習一時爽,一直學習一直爽
Hello,大家好,我是Connor,一個從無到有的技術小白。前面我們就算是把所有的網頁訪問與網頁解析的方法給大家講完了。為了幫助大家更好的使用這些方法。我們專門抽出一期,來做一個例子,看看在實際應用中我們是如何使用前面的這些知識的。
好吧,那我們快點開始。本期,我們以全書網為例,來爬取全書網的小說下面我們就開始進行分析吧,下面是全書網的網址:
1. 初步爬取
不管爬取什麼網站,我們第一步要做的都是來分析這個網站。所以我們先來開啟全書網,分析一下這個網站:
1.1 分析全書網
1.1.1 分析目標網址
我們想要從網上獲取資訊,就要知道這個資訊的地址,我們把它叫做目標網址,所以我們先要分析目標網址:
可以看到首頁有許多小說,但是這些地址並不是我們的目標網址,因為我們想要的是具體的小說的章節內容,所以我們需要再次尋找。我們以《盜墓筆記》的第一章為目標,我們繼續來尋找目標網址:
這個頁面也不是我們的目標網址,但是它裡面包含有目標網址,即 《盜墓筆記》第一章的詳情頁地址在其中,我們可以點選第一章來檢視我們的目標網址:
當我們點選了第一章的連線後,我們又一次進入了一個新的頁面,這個頁面有了具體的小說內容。所以這一頁使我們需要的內容了。也就是說這一頁的網址是我們真正需要的目標網址。
1.1.2 分析網頁原始碼
我們現在找到了我們需要的目標網址了。但是還有一個問題。我們所能提取的內容一定是在網頁原始碼裡擁有的內容。因為我們訪問網頁所返回的響應就是網頁原始碼。這篇小說的正文在網頁原始碼中嗎?我們再來看一下這個頁面的網頁原始碼:
仔細一看網頁原始碼,裡面有我們想要的內容。那我們現在就可以開始進行網頁訪問,然後獲取這章小說的內容了。
1.1.3 分析所需內容
我們通過分析網頁原始碼,認定我們可以通過直接訪問來獲取我們所需要的內容。但是我們訪問所返回的網頁原始碼中全部都是我們所需要的內容嗎?很明顯不是這樣的。因此我們還需要進一步分析所需內容,來為我們訪問後的提取做準備。
通過分析,我們發現我們所有需要的內容全部都在 <div class="mainContenr" id="content">
這個標籤下,所以確定了所需內容,我們就可以開始進行爬取了。
1.2 爬取全書網
1.2.1 訪問目標網址
好,我們把該分析的東西都分析了,現在就是來使用我們學過的知識來獲取我們想要的內容的時候了。首先我們來訪問我們分析出的目標網址:
import requests
url = 'http://www.quanshuwang.com/book/9/9055/9674264.html'
response = requests.get(url).text
print(response)
複製程式碼
執行結果:
看執行結果看得出,我們已經訪問成功了,獲取到了這個網址的網頁原始碼。但是我們發現裡面有好多亂碼,我們不認識的東西。如果你還記得我的第三式 requests 的話,你應該有印象我說過網頁編碼問題。那麼我們來改一下程式碼,解決這個問題:
import requests
url = 'http://www.quanshuwang.com/book/9/9055/9674264.html'
response = requests.get(url)
response.encoding = 'gbk'
print(response.text)
複製程式碼
執行結果:
亂碼問題一下子就解決了。那我們現在獲取到了網頁原始碼,下面就是要提取所需內容了,我們前面分析過了,下面我們來進行提取:
import requests
import re
url = 'http://www.quanshuwang.com/book/9/9055/9674264.html'
response = requests.get(url)
response.encoding = 'gbk'
result = re.search(r'(</script> )(.*?)(<script type="text/javascript">)', response.text, re.S)
print(result.group(2))
複製程式碼
執行結果:
一下子就把我們想要的東西提取出來了對吧?但是你會發現裡面還是有些亂七八糟的東西並不屬於文章的正文。我們不想要這些東西,只想要文章正文怎麼辦?這個時候就需要用到我們前面學習的使用各種提取方法來提取網頁內容了。我們以正則為例,來看看如何提取:
import requests
import re
url = 'http://www.quanshuwang.com/book/9/9055/9674264.html'
response = requests.get(url)
response.encoding = 'gbk'
result = re.search(r'(</script> )(.*?)(<script type="text/javascript">)', response.text, re.S)
print(re.sub(' |<br />', '', result.group(2)))
複製程式碼
我們來看看執行結果如何?
&emps;可以看到,我們把所有的無用的字元都過濾掉了。這樣就獲取了我們想要的小說。獲取到了我們想要的小說,下面我們來把獲取到的資料來儲存到txt檔案中。
我們執行下面的程式:
import requests
import re
url = 'http://www.quanshuwang.com/book/9/9055/9674264.html'
response = requests.get(url)
response.encoding = 'gbk'
result = re.search(r'(</script> )(.*?)(<script type="text/javascript">)', response.text, re.S)
content = re.sub(' |<br />', '', result.group(2))
with open('dmbj.txt', 'w') as f:
f.write(content)
複製程式碼
執行完成之後,我們可以看一下儲存的txt內容:
這樣就儲存好了。到這裡我們就完成了對全書網的簡單爬取。
2. 進一步爬取
我們可以簡單地進行某一章的小說的爬取。但是如果我們想要爬取整部小說呢?難道我們需要把每一章的url都寫出來然後進行逐一爬取嗎?這太麻煩了。而且並不實用。那下面我們來看看如何完整的爬取一部小說的完整章節。
2.1 獲取每一篇小說的網址
你是否還記得我們前面看到的一個頁面?那一個網頁上有整個小說的所有章節的目錄。我們可以通過這裡來獲取所有章節的url。
那我們再來分析這個網頁來獲取所有章節的url。首先我們來分析一下網頁的原始碼:
檢視網頁原始碼,我們可以看到所有的章節連線都在網頁原始碼中。我們同樣可以通過直接訪問來進行提取:
import requests
import re
url = 'http://www.quanshuwang.com/book/9/9055'
response = requests.get(url)
response.encoding = 'gbk'
result = re.findall(r'<li><a href="(http://www.quanshuwang.com/book.*?)".*?>(.*?)</a></li>', response.text, re.S)
print(result)
複製程式碼
通過這段程式碼,我們可以獲取所有的網頁網址和章節標題。我們可以看下執行結果:
所有的章節地址和章節標題我們就都獲取出來了。我們可以通過遍歷列表來進行每一章的內容獲取。這一部分只需要重複前面的內容即可。就不再多做解釋了。
當然,由於程式是單執行緒的,之一的遍歷列表來獲取文章的方式相對來說太慢了。並沒有什麼實用價值。我們可以通過執行緒池的方法來避免阻塞,從而實現加速的效果。多執行緒和執行緒池我們也會在之後的系列為大家進行講解。
例子舉得都是最簡單的例子。這個網站並沒有任何的反爬措施,所以作為初級的入門非常好用。但是在實際的生產中。網站會有各種各樣的反爬措施。我們也會在該系列後續的文章中談到如何突破反爬。
下期預告
現在我們都會簡單的爬取了。但是有些網站上獲取不到我們想要的資料,那我們還有方式來獲取我們想要的資料嗎?當然有,那就是selenium來進行爬取了。敬請期待下一期: Python 爬蟲十六式 - 第九式:selenium - 輕鬆獲取資料!
好了,這就是我們這期的內容了,舉了一個非常簡單的例子。不知道你今天是否對前面的內容有了一個更高層次的認識了呢?我是 Connor 一個從無到有的技術小白,願你在學習的道路上能夠堅持不懈,砥礪前行!
系列文章
Python 爬蟲十六式 - 第一式:HTTP協議 >>>
Python 爬蟲十六式 - 第二式:urllib 與 urllib3 >>>
Python 爬蟲十六式 - 第三式:Requests的用法 >>>
Python 爬蟲十六式 - 第四式: 使用Xpath提取網頁內容 >>>
Python 爬蟲十六式 - 第五式:BeautifulSoup,美味的湯 >>>
Python 爬蟲十六式 - 第六式:JQuery的假兄弟-pyquery >>>
Python 爬蟲十六式 - 第七式:RE:用匹配來演繹變成的藝術 >>>