學習一時爽,一直學習一直爽javascript
Hello,你們好,我是Connor,一個從無到有的技術小白。前面咱們就算是把全部的網頁訪問與網頁解析的方法給你們講完了。爲了幫助你們更好的使用這些方法。咱們專門抽出一期,來作一個例子,看看在實際應用中咱們是如何使用前面的這些知識的。html
好吧,那咱們快點開始。本期,咱們以全書網爲例,來爬取全書網的小說下面咱們就開始進行分析吧,下面是全書網的網址:java
www.quanshuwang.com/python
無論爬取什麼網站,咱們第一步要作的都是來分析這個網站。因此咱們先來打開全書網,分析一下這個網站:多線程
咱們想要從網上獲取信息,就要知道這個信息的地址,咱們把它叫作目標網址,因此咱們先要分析目標網址:post
能夠看到首頁有許多小說,可是這些地址並非咱們的目標網址,由於咱們想要的是具體的小說的章節內容,因此咱們須要再次尋找。咱們以《盜墓筆記》的第一章爲目標,咱們繼續來尋找目標網址:學習
這個頁面也不是咱們的目標網址,可是它裏面包含有目標網址,即 《盜墓筆記》第一章的詳情頁地址在其中,咱們能夠點擊第一章來查看咱們的目標網址:網站
當咱們點擊了第一章的鏈接後,咱們又一次進入了一個新的頁面,這個頁面有了具體的小說內容。因此這一頁使咱們須要的內容了。也就是說這一頁的網址是咱們真正須要的目標網址。編碼
咱們如今找到了咱們須要的目標網址了。可是還有一個問題。咱們所能提取的內容必定是在網頁源代碼裏擁有的內容。由於咱們訪問網頁所返回的響應就是網頁源代碼。這篇小說的正文在網頁源代碼中嗎?咱們再來看一下這個頁面的網頁源代碼:url
仔細一看網頁源代碼,裏面有咱們想要的內容。那咱們如今就能夠開始進行網頁訪問,而後獲取這章小說的內容了。
咱們經過分析網頁源代碼,認定咱們能夠經過直接訪問來獲取咱們所須要的內容。可是咱們訪問所返回的網頁源代碼中所有都是咱們所須要的內容嗎?很明顯不是這樣的。所以咱們還須要進一步分析所需內容,來爲咱們訪問後的提取作準備。
經過分析,咱們發現咱們全部須要的內容所有都在 <div class="mainContenr" id="content">
這個標籤下,因此肯定了所需內容,咱們就能夠開始進行爬取了。
好,咱們把該分析的東西都分析了,如今就是來使用咱們學過的知識來獲取咱們想要的內容的時候了。首先咱們來訪問咱們分析出的目標網址:
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內容:
這樣就保存好了。到這裏咱們就完成了對全書網的簡單爬取。
咱們能夠簡單地進行某一章的小說的爬取。可是若是咱們想要爬取整部小說呢?難道咱們須要把每一章的url都寫出來而後進行逐一爬取嗎?這太麻煩了。並且並不實用。那下面咱們來看看如何完整的爬取一部小說的完整章節。
你是否還記得咱們前面看到的一個頁面?那一個網頁上有整個小說的全部章節的目錄。咱們能夠經過這裏來獲取全部章節的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:用匹配來演繹變成的藝術 >>>