python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)
原標(biāo)題:【實(shí)戰(zhàn)練習(xí)】Python3網(wǎng)絡(luò)爬蟲快速入門實(shí)戰(zhàn)解析(上)
摘要
使用python3學(xué)習(xí)網(wǎng)絡(luò)爬蟲,快速入門靜態(tài)網(wǎng)站爬取和動(dòng)態(tài)網(wǎng)站爬取
[
前言
]
強(qiáng)烈建議:請(qǐng)?jiān)陔娔X的陪同下,閱讀本文。本文以實(shí)戰(zhàn)為主,閱讀過(guò)程如稍有不適,還望多加練習(xí)。
本文的實(shí)戰(zhàn)內(nèi)容有:
網(wǎng)絡(luò)小說(shuō)下載(靜態(tài)網(wǎng)站)
優(yōu)美壁紙下載(動(dòng)態(tài)網(wǎng)站)
愛奇藝VIP視頻下載
[
網(wǎng)絡(luò)爬蟲簡(jiǎn)介
]
網(wǎng)絡(luò)爬蟲,也叫網(wǎng)絡(luò)蜘蛛(Web Spider)。它根據(jù)網(wǎng)頁(yè)地址(URL)爬取網(wǎng)頁(yè)內(nèi)容,而網(wǎng)頁(yè)地址(URL)就是我們?cè)跒g覽器中輸入的網(wǎng)站鏈接。比如:https://www.baidu.com/,它就是一個(gè)URL。
在講解爬蟲內(nèi)容之前,我們需要先學(xué)習(xí)一項(xiàng)寫爬蟲的必備技能:審查元素(如果已掌握,可跳過(guò)此部分內(nèi)容)。
1、審查元素
在瀏覽器的地址欄輸入U(xiǎn)RL地址,在網(wǎng)頁(yè)處右鍵單擊,找到檢查。(不同瀏覽器的叫法不同,Chrome瀏覽器叫做檢查,Firefox瀏覽器叫做查看元素,但是功能都是相同的)
我們可以看到,右側(cè)出現(xiàn)了一大推代碼,這些代碼就叫做HTML。什么是HTML?舉個(gè)容易理解的例子:我們的基因決定了我們的原始容貌,服務(wù)器返回的HTML決定了網(wǎng)站的原始容貌。
為啥說(shuō)是原始容貌呢?因?yàn)槿丝梢哉莅?#xff01;扎心了,有木有?那網(wǎng)站也可以"整容"嗎?可以!請(qǐng)看下圖:
我能有這么多錢嗎?顯然不可能。我是怎么給網(wǎng)站"整容"的呢?就是通過(guò)修改服務(wù)器返回的HTML信息。我們每個(gè)人都是"整容大師",可以修改頁(yè)面信息。我們?cè)陧?yè)面的哪個(gè)位置點(diǎn)擊審查元素,瀏覽器就會(huì)為我們定位到相應(yīng)的HTML位置,進(jìn)而就可以在本地更改HTML信息。
再舉個(gè)小例子:我們都知道,使用瀏覽器"記住密碼"的功能,密碼會(huì)變成一堆小黑點(diǎn),是不可見的。可以讓密碼顯示出來(lái)嗎?可以,只需給頁(yè)面"動(dòng)個(gè)小手術(shù)"!以淘寶為例,在輸入密碼框處右鍵,點(diǎn)擊檢查。
可以看到,瀏覽器為我們自動(dòng)定位到了相應(yīng)的HTML位置。將下圖中的password屬性值改為text屬性值(直接在右側(cè)代碼處修改):
我們讓瀏覽器記住的密碼就這樣顯現(xiàn)出來(lái)了:
說(shuō)這么多,什么意思呢?瀏覽器就是作為客戶端從服務(wù)器端獲取信息,然后將信息解析,并展示給我們的。我們可以在本地修改HTML信息,為網(wǎng)頁(yè)"整容",但是我們修改的信息不會(huì)回傳到服務(wù)器,服務(wù)器存儲(chǔ)的HTML信息不會(huì)改變。刷新一下界面,頁(yè)面還會(huì)回到原本的樣子。這就跟人整容一樣,我們能改變一些表面的東西,但是不能改變我們的基因。
2、簡(jiǎn)單實(shí)例
網(wǎng)絡(luò)爬蟲的第一步就是根據(jù)URL,獲取網(wǎng)頁(yè)的HTML信息。在Python3中,可以使用urllib.request和requests進(jìn)行網(wǎng)頁(yè)爬取。
1.urllib庫(kù)是python內(nèi)置的,無(wú)需我們額外安裝,只要安裝了Python就可以使用這個(gè)庫(kù)。
2.requests庫(kù)是第三方庫(kù),需要我們自己安裝。
requests庫(kù)強(qiáng)大好用,所以本文使用requests庫(kù)獲取網(wǎng)頁(yè)的HTML信息。requests庫(kù)的github地址:https://github.com/requests/requests
(1)requests安裝
在cmd中,使用如下指令安裝requests:
或者:
(2)簡(jiǎn)單實(shí)例
requests庫(kù)的基礎(chǔ)方法如下:
官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.htmlrequests庫(kù)的開發(fā)者為我們提供了詳細(xì)的中文教程,查詢起來(lái)很方便。本文不會(huì)對(duì)其所有內(nèi)容進(jìn)行講解,摘取其部分使用到的內(nèi)容,進(jìn)行實(shí)戰(zhàn)說(shuō)明。
首先,讓我們看下requests.get()方法,它用于向服務(wù)器發(fā)起GET請(qǐng)求,不了解GET請(qǐng)求沒(méi)有關(guān)系。我們可以這樣理解:get的中文意思是得到、抓住,那這個(gè)requests.get()方法就是從服務(wù)器得到、抓住數(shù)據(jù),也就是獲取數(shù)據(jù)。讓我們看一個(gè)例子(以 www.gitbook.cn為例)來(lái)加深理解:
requests.get()方法必須設(shè)置的一個(gè)參數(shù)就是url,因?yàn)槲覀兊酶嬖VGET請(qǐng)求,我們的目標(biāo)是誰(shuí),我們要獲取誰(shuí)的信息。運(yùn)行程序看下結(jié)果:
左側(cè)是我們程序獲得的結(jié)果,右側(cè)是我們?cè)趙ww.gitbook.cn網(wǎng)站審查元素獲得的信息。我們可以看到,我們已經(jīng)順利獲得了該網(wǎng)頁(yè)的HTML信息。這就是一個(gè)最簡(jiǎn)單的爬蟲實(shí)例,可能你會(huì)問(wèn),我只是爬取了這個(gè)網(wǎng)頁(yè)的HTML信息,有什么用呢?客官稍安勿躁,接下來(lái)進(jìn)入我們的實(shí)戰(zhàn)正文。
[
爬蟲實(shí)戰(zhàn)
]
1、小說(shuō)下載
(1)實(shí)戰(zhàn)背景
小說(shuō)網(wǎng)站-筆趣看:
URL:http://www.biqukan.com/
筆趣看是一個(gè)盜版小說(shuō)網(wǎng)站,這里有很多起點(diǎn)中文網(wǎng)的小說(shuō),該網(wǎng)站小說(shuō)的更新速度稍滯后于起點(diǎn)中文網(wǎng)正版小說(shuō)的更新速度。并且該網(wǎng)站只支持在線瀏覽,不支持小說(shuō)打包下載。因此,本次實(shí)戰(zhàn)就是從該網(wǎng)站爬取并保存一本名為《一念永恒》的小說(shuō),該小說(shuō)是耳根正在連載中的一部玄幻小說(shuō)。PS:本實(shí)例僅為交流學(xué)習(xí),支持耳根大大,請(qǐng)上起點(diǎn)中文網(wǎng)訂閱。
(2)小試牛刀
我們先看下《一念永恒》小說(shuō)的第一章內(nèi)容,URL:http://www.biqukan.com/1_1094/5403177.html
我們先用已經(jīng)學(xué)到的知識(shí)獲取HTML信息試一試,編寫代碼如下:
運(yùn)行代碼,可以看到如下結(jié)果:
可以看到,我們很輕松地獲取了HTML信息。但是,很顯然,很多信息是我們不想看到的,我們只想獲得如右側(cè)所示的正文內(nèi)容,我們不關(guān)心div、br這些html標(biāo)簽。如何把正文內(nèi)容從這些眾多的html標(biāo)簽中提取出來(lái)呢?這就是本次實(shí)戰(zhàn)的主要內(nèi)容。
(3)Beautiful Soup
爬蟲的第一步,獲取整個(gè)網(wǎng)頁(yè)的HTML信息,我們已經(jīng)完成。接下來(lái)就是爬蟲的第二步,解析HTML信息,提取我們感興趣的內(nèi)容。對(duì)于本小節(jié)的實(shí)戰(zhàn),我們感興趣的內(nèi)容就是文章的正文。提取的方法有很多,例如使用正則表達(dá)式、Xpath、Beautiful Soup等。對(duì)于初學(xué)者而言,最容易理解,并且使用簡(jiǎn)單的方法就是使用Beautiful Soup提取感興趣內(nèi)容。
Beautiful Soup的安裝方法和requests一樣,使用如下指令安裝(也是二選一):
1.pip install beautifulsoup4
2.easy_install beautifulsoup4
一個(gè)強(qiáng)大的第三方庫(kù),都會(huì)有一個(gè)詳細(xì)的官方文檔。我們很幸運(yùn),Beautiful Soup也是有中文的官方文檔。URL:
http://beautifulsoup.readthedocs.io/zh_CN/latest/
同理,我會(huì)根據(jù)實(shí)戰(zhàn)需求,講解Beautiful Soup庫(kù)的部分使用方法,更詳細(xì)的內(nèi)容,請(qǐng)查看官方文檔。
現(xiàn)在,我們使用已經(jīng)掌握的審查元素方法,查看一下我們的目標(biāo)頁(yè)面,你會(huì)看到如下內(nèi)容:
不難發(fā)現(xiàn),文章的所有內(nèi)容都放在了一個(gè)名為div的“東西下面”,這個(gè)"東西"就是html標(biāo)簽。HTML標(biāo)簽是HTML語(yǔ)言中最基本的單位,HTML標(biāo)簽是HTML最重要的組成部分。不理解,沒(méi)關(guān)系,我們?cè)倥e個(gè)簡(jiǎn)單的例子:
一個(gè)女人的包包里,會(huì)有很多東西,她們會(huì)根據(jù)自己的習(xí)慣將自己的東西進(jìn)行分類放好。鏡子和口紅這些會(huì)經(jīng)常用到的東西,會(huì)歸放到容易拿到的外側(cè)口袋里。那些不經(jīng)常用到,需要注意安全存放的證件會(huì)放到不容易拿到的里側(cè)口袋里。
html標(biāo)簽就像一個(gè)個(gè)“口袋”,每個(gè)“口袋”都有自己的特定功能,負(fù)責(zé)存放不同的內(nèi)容。顯然,上述例子中的div標(biāo)簽下存放了我們關(guān)心的正文內(nèi)容。這個(gè)div標(biāo)簽是這樣的:
細(xì)心的朋友可能已經(jīng)發(fā)現(xiàn),除了div字樣外,還有id和class。id和class就是div標(biāo)簽的屬性,content和showtxt是屬性值,一個(gè)屬性對(duì)應(yīng)一個(gè)屬性值。這東西有什么用?它是用來(lái)區(qū)分不同的div標(biāo)簽的,因?yàn)閐iv標(biāo)簽可以有很多,我們?cè)趺醇右詤^(qū)分不同的div標(biāo)簽?zāi)?#xff1f;就是通過(guò)不同的屬性值。
仔細(xì)觀察目標(biāo)網(wǎng)站一番,我們會(huì)發(fā)現(xiàn)這樣一個(gè)事實(shí):class屬性為showtxt的div標(biāo)簽,獨(dú)一份!這個(gè)標(biāo)簽里面存放的內(nèi)容,是我們關(guān)心的正文部分。
知道這個(gè)信息,我們就可以使用Beautiful Soup提取我們想要的內(nèi)容了,編寫代碼如下:
在解析html之前,我們需要?jiǎng)?chuàng)建一個(gè)Beautiful Soup對(duì)象。BeautifulSoup函數(shù)里的參數(shù)就是我們已經(jīng)獲得的html信息。然后我們使用find_all方法,獲得html信息中所有class屬性為showtxt的div標(biāo)簽。find_all方法的第一個(gè)參數(shù)是獲取的標(biāo)簽名,第二個(gè)參數(shù)class_是標(biāo)簽的屬性,為什么不是class,而帶了一個(gè)下劃線呢?因?yàn)閜ython中class是關(guān)鍵字,為了防止沖突,這里使用class_表示標(biāo)簽的class屬性,class_后面跟著的showtxt就是屬性值了。看下我們要匹配的標(biāo)簽格式:
這樣對(duì)應(yīng)的看一下,是不是就懂了?可能有人會(huì)問(wèn)了,為什么不是find_all('div', id = 'content', class_ = 'showtxt')?這樣其實(shí)也是可以的,屬性是作為查詢時(shí)候的約束條件,添加一個(gè)class_='showtxt'條件,我們就已經(jīng)能夠準(zhǔn)確匹配到我們想要的標(biāo)簽了,所以我們就不必再添加id這個(gè)屬性了。運(yùn)行代碼查看我們匹配的結(jié)果:
我們可以看到,我們已經(jīng)順利匹配到我們關(guān)心的正文內(nèi)容,但是還有一些我們不想要的東西。比如div標(biāo)簽名,br標(biāo)簽,以及各種空格。怎么去除這些東西呢?我們繼續(xù)編寫代碼:
find_all匹配的返回的結(jié)果是一個(gè)列表。提取匹配結(jié)果后,使用text屬性,提取文本內(nèi)容,濾除br標(biāo)簽。隨后使用replace方法,剔除空格,替換為回車進(jìn)行分段。 在html中是用來(lái)表示空格的。replace('xa0'*8,'nn')就是去掉下圖的八個(gè)空格符號(hào),并用回車代替:
程序運(yùn)行結(jié)果如下:
可以看到,我們很自然的匹配到了所有正文內(nèi)容,并進(jìn)行了分段。我們已經(jīng)順利獲得了一個(gè)章節(jié)的內(nèi)容,要想下載正本小說(shuō),我們就要獲取每個(gè)章節(jié)的鏈接。我們先分析下小說(shuō)目錄:
URL:http://www.biqukan.com/1_1094/
通過(guò)審查元素,我們發(fā)現(xiàn)可以發(fā)現(xiàn),這些章節(jié)都存放在了class屬性為listmain的div標(biāo)簽下,選取部分html代碼如下:
在分析之前,讓我們先介紹一個(gè)概念:父節(jié)點(diǎn)、子節(jié)點(diǎn)、孫節(jié)點(diǎn)。
和 限定了 標(biāo)簽的開始和結(jié)束的位置,他們是成對(duì)出現(xiàn)的,有開始位置,就有結(jié)束位置。我們可以看到,在標(biāo)簽包含標(biāo)簽的子節(jié)點(diǎn),標(biāo)簽和他們之間的關(guān)系都是相對(duì)的。比如對(duì)于
看到這里可能有人會(huì)問(wèn),這有好多
總結(jié)
以上是生活随笔為你收集整理的python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么叫云平台_为什么说云原生会成为未来企
- 下一篇: SuperMap导航条控件设置