溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

發(fā)布時(shí)間:2021-11-20 14:31:49 來(lái)源:億速云 閱讀:150 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析”吧!

先來(lái)看一段簡(jiǎn)單的代碼。

import requests #導(dǎo)入requests包
url = 'https://www.cnblogs.com/LexMoon/'
strhtml = requests.get(url) #get方式獲取網(wǎng)頁(yè)數(shù)據(jù)
print(strhtml.text)

首先是import requests來(lái)導(dǎo)入網(wǎng)絡(luò)請(qǐng)求相關(guān)的包,然后定義一個(gè)字符串url也就是目標(biāo)網(wǎng)頁(yè),之后我們就要用導(dǎo)入的requests包來(lái)請(qǐng)求這個(gè)網(wǎng)頁(yè)的內(nèi)容。

這里用了requests.get(url),這個(gè)get并不是拿取的那個(gè)get,而是一種關(guān)于網(wǎng)絡(luò)請(qǐng)求的方法。

網(wǎng)絡(luò)請(qǐng)求的方法有很多,最常見(jiàn)的有g(shù)et,post,其它如put,delete你幾乎不會(huì)見(jiàn)到。

requests.get(url)就是向url這個(gè)網(wǎng)頁(yè)發(fā)送get請(qǐng)求(request),然后會(huì)返回一個(gè)結(jié)果,也就是這次請(qǐng)求的響應(yīng)信息。

響應(yīng)信息中分為響應(yīng)頭和響應(yīng)內(nèi)容。

響應(yīng)頭就是你這次訪問(wèn)是不是成功了,返回給你的是什么類型的數(shù)據(jù),還有很多一些。

響應(yīng)內(nèi)容中就是你獲得的網(wǎng)頁(yè)源碼了。

好了,這樣你就算是入門Python爬蟲(chóng)了,但是還是有很多問(wèn)題。

1. get和post請(qǐng)求有什么區(qū)別?

2. 為什么有些網(wǎng)頁(yè)我爬取到了,里面卻沒(méi)有我想要的數(shù)據(jù)?

3. 為什么有些網(wǎng)站我爬下來(lái)的內(nèi)容和我真實(shí)看到的網(wǎng)站內(nèi)容不一樣?

get和post請(qǐng)求有什么區(qū)別?

get和post的區(qū)別主要在于參數(shù)的位置,比如說(shuō)有一個(gè)需要登錄用戶的網(wǎng)站,當(dāng)我們點(diǎn)擊登錄之后,賬號(hào)密碼應(yīng)該放在哪里。

get請(qǐng)求最直觀的體現(xiàn)就是請(qǐng)求的參數(shù)就放在了URL中。

比如說(shuō)你百度Python這個(gè)關(guān)鍵字,就可以發(fā)現(xiàn)它的URL如下:

https://www.baidu.com/s?wd=Python&rsv_spt=1

這里面的dw=Python就是參數(shù)之一了,get請(qǐng)求的參數(shù)用?開(kāi)始,用&分隔。

如果我們需要輸入密碼的網(wǎng)站用了get請(qǐng)求,我們的個(gè)人信息不是很容易暴露嗎,所以就需要post請(qǐng)求了。

在post請(qǐng)求中,參數(shù)會(huì)放在請(qǐng)求體內(nèi)。

比如說(shuō)下面是我登錄W3C網(wǎng)站時(shí)的請(qǐng)求,可以看到Request Method是post方式。

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

在請(qǐng)求的下面還有我們發(fā)送的登錄信息,里面就是加密過(guò)后的賬號(hào)密碼,發(fā)送給對(duì)方服務(wù)器來(lái)檢驗(yàn)的。

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

為什么有些網(wǎng)頁(yè)我爬取到了,里面卻沒(méi)有我想要的數(shù)據(jù)?

我們的爬蟲(chóng)有時(shí)候可能爬下來(lái)一個(gè)網(wǎng)站,在查看里面數(shù)據(jù)的時(shí)候會(huì)發(fā)現(xiàn),爬下來(lái)的是目標(biāo)網(wǎng)頁(yè),但是里面我們想要的數(shù)據(jù)卻沒(méi)有。

這個(gè)問(wèn)題大多數(shù)發(fā)生在目標(biāo)數(shù)據(jù)是那些列表型的網(wǎng)頁(yè),比如說(shuō)前幾天班上一個(gè)同學(xué)問(wèn)了我一個(gè)問(wèn)題,他在爬攜程的航班信息時(shí),爬下來(lái)的網(wǎng)頁(yè)除了獲得不了航班的信息,其他地方都可以拿到。

如下圖:

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

這是一個(gè)很常見(jiàn)的問(wèn)題,因?yàn)樗鹯equests.get的時(shí)候,是去get的上面我放的那個(gè)URL地址,但是這個(gè)網(wǎng)頁(yè)雖然是這個(gè)地址,但是他里面的數(shù)據(jù)卻不是這個(gè)地址。

聽(tīng)起來(lái)很像很難,但是從攜程這個(gè)網(wǎng)站的設(shè)計(jì)人的角度來(lái)說(shuō),加載的這部分航班列表信息可能很龐大,如果你是直接放在這個(gè)網(wǎng)頁(yè)里面,我們用戶打開(kāi)這個(gè)網(wǎng)頁(yè)可能需要很久,以至于認(rèn)為網(wǎng)頁(yè)掛了然后關(guān)閉,所以設(shè)計(jì)者在這個(gè)URL請(qǐng)求中只放了主體框架,讓用戶很快進(jìn)入網(wǎng)頁(yè)中,而主要的航班數(shù)據(jù)則是之后再加載,這樣用戶就不會(huì)因?yàn)榈却荛L(zhǎng)時(shí)間而退出了。

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

說(shuō)到底怎么做是為了用戶體驗(yàn),那么我們應(yīng)該怎么解決這個(gè)問(wèn)題呢?

如果你學(xué)過(guò)前端,你應(yīng)該知道Ajax異步請(qǐng)求,不知道也沒(méi)事,畢竟我們這里不是在說(shuō)前端技術(shù)。

我們只需要知道我們最開(kāi)始請(qǐng)求的https://flights.ctrip.com/itinerary/oneway/cgq-bjs?date=2019-09-14這個(gè)網(wǎng)頁(yè)中有一段js腳本,在這個(gè)網(wǎng)頁(yè)請(qǐng)求到之后會(huì)去執(zhí)行,而這段腳本的目的就是去請(qǐng)求我們要爬的航班信息。

這時(shí)候我們可以打開(kāi)瀏覽器的控制臺(tái),推薦使用谷歌或者火狐瀏覽器,按F進(jìn)入坦克,不,按F12進(jìn)入瀏覽器控制臺(tái),然后點(diǎn)擊NetWork。

在這里我們就可以看到這個(gè)網(wǎng)頁(yè)中發(fā)生的所有網(wǎng)絡(luò)請(qǐng)求和響應(yīng)了。

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

在這里面我們可以找到請(qǐng)求航班信息的其實(shí)是https://flights.ctrip.com/itinerary/api/12808/products這個(gè)URL。

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

為什么有些網(wǎng)站我爬下來(lái)的內(nèi)容和我真實(shí)看到的網(wǎng)站內(nèi)容不一樣?

最后一個(gè)問(wèn)題就是為什么有些網(wǎng)站我爬下來(lái)的內(nèi)容和我真實(shí)看到的網(wǎng)站內(nèi)容不一樣?

這個(gè)的主要原因是,你的爬蟲(chóng)沒(méi)有登錄。

就像我們平常瀏覽網(wǎng)頁(yè),有些信息需要登錄才能訪問(wèn),爬蟲(chóng)也是如此。

這就涉及到了一個(gè)很重要的概念,我們的平常觀看網(wǎng)頁(yè)是基于Http請(qǐng)求的,而Http是一種無(wú)狀態(tài)的請(qǐng)求。

什么是無(wú)狀態(tài)? 你可以理解為它不認(rèn)人,也就是說(shuō)你的請(qǐng)求到了對(duì)方服務(wù)器那里,對(duì)方服務(wù)器是不知道你到底是誰(shuí)。

既然如此,我們登錄之后為什么還可以長(zhǎng)時(shí)間繼續(xù)訪問(wèn)這個(gè)網(wǎng)頁(yè)呢?

這是因?yàn)镠ttp雖然是無(wú)狀態(tài)的,但是對(duì)方服務(wù)器卻給我們安排了身份證,也就是cookie。

在我們第一次進(jìn)入這個(gè)網(wǎng)頁(yè)時(shí),如果之前沒(méi)有訪問(wèn)過(guò),服務(wù)器就會(huì)給我們一個(gè)cookie,之后我們?cè)谶@個(gè)網(wǎng)頁(yè)上的任何請(qǐng)求操作,都要把cookie放進(jìn)去。這樣服務(wù)器就可以根據(jù)cookie來(lái)辨識(shí)我們是誰(shuí)了。

Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析

比如知乎里面就可以找到相關(guān)的cookie。

對(duì)于這類網(wǎng)站,我們直接從瀏覽器中拿到已有的cookie放進(jìn)代碼中使用,requests.get(url,cookies="aidnwinfawinf"),也可以讓爬蟲(chóng)去模擬登錄這個(gè)網(wǎng)站來(lái)拿到cookie。

感謝各位的閱讀,以上就是“Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python網(wǎng)絡(luò)爬蟲(chóng)舉例分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI