Python 爬蟲十六式 - 第八式:實例解析 - 全書網

實例解析- 全書網

學習一時爽,一直學習一直爽

  Hello,大家好,我是Connor,一個從無到有的技術小白。前面我們就算是把所有的網頁訪問與網頁解析的方法給大家講完了。爲了幫助大家更好的使用這些方法。我們專門抽出一期,來做一個例子,看看在實際應用中我們是如何使用前面的這些知識的。

  好吧,那我們快點開始。本期,我們以全書網爲例,來爬取全書網的小說下面我們就開始進行分析吧,下面是全書網的網址:

http://www.quanshuwang.com/

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>&nbsp;&nbsp;)(.*?)(<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>&nbsp;&nbsp;)(.*?)(<script type="text/javascript">)', response.text, re.S)
print(re.sub('&nbsp;|<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>&nbsp;&nbsp;)(.*?)(<script type="text/javascript">)', response.text, re.S)
content = re.sub('&nbsp;|<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:用匹配來演繹編程的藝術 >>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章