国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
「爬蟲教程」第一章:python爬蟲基礎(chǔ)教程

原文鏈接:
https://blog.csdn.net/weixin_43521592/java/article/details/106650960

1.1 通用爬蟲與聚焦爬蟲

通用爬蟲:主要將互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,形成一個(gè)互聯(lián)網(wǎng)的鏡像備份。

聚焦爬蟲:通過(guò)特定的規(guī)則對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行與需求相關(guān)的爬取。

1.2 http協(xié)議

首先看一下在瀏覽器中是怎么樣發(fā)送一個(gè)http請(qǐng)求的過(guò)程:

當(dāng)你輸入網(wǎng)址(也叫url)回車的時(shí)候,瀏覽器會(huì)向服務(wù)器發(fā)送Request請(qǐng)求去獲取該網(wǎng)址的html文件。

服務(wù)器將對(duì)應(yīng)的html文件作為Response對(duì)象返回給瀏覽器。

當(dāng)瀏覽器解析Response中的html文件時(shí),如果發(fā)現(xiàn)此文件還引用了其他的文件,例如js文件、css文件、圖片等,瀏覽器會(huì)自動(dòng)再發(fā)送請(qǐng)求去獲取這些文件。

當(dāng)所有文件都成功獲取了之后,網(wǎng)頁(yè)會(huì)自動(dòng)解析展示給用戶。

1.3 URL詳解

URL:是Uniform Resource Locator的簡(jiǎn)寫,叫做統(tǒng)一資源定位符。

URL的組成:scheme://host:post/path?queryString#anchor

scheme:訪問(wèn)協(xié)議,一般是http、https、ftp等。

host:主機(jī)名/域名,比如www.baidu.com。定位到主機(jī)。

post:端口號(hào)。定位到應(yīng)用。因?yàn)橐慌_(tái)主機(jī)可能作為多個(gè)應(yīng)用的服務(wù)器,所以需要用端口號(hào)來(lái)識(shí)別。

path:查找路徑。例如www.baidu.com/login。定位到具體的文件。

queryString:查詢字符串/請(qǐng)求參數(shù)。例如www.baidu.com/s?wd=python 瀏覽器發(fā)送Request請(qǐng)求時(shí)會(huì)把請(qǐng)求參數(shù)解析為{“wd”:”python”}發(fā)送到后端,后端會(huì)對(duì)參數(shù)做相應(yīng)的處理。

anchor:錨點(diǎn)。前端用做網(wǎng)頁(yè)定位的。比如很多網(wǎng)絡(luò)小說(shuō)的章節(jié)跳轉(zhuǎn),多數(shù)用的就是錨點(diǎn)。

tips:http的端口默認(rèn)是80,https的端口默認(rèn)是443

1.4 常見(jiàn)的請(qǐng)求方式

在HTTP請(qǐng)求中,定義了八種請(qǐng)求方式,常見(jiàn)的有g(shù)et和post:

get請(qǐng)求:直接從服務(wù)器獲取數(shù)據(jù),不會(huì)對(duì)服務(wù)器資源產(chǎn)生影響。get請(qǐng)求攜帶的參數(shù)長(zhǎng)度有限制,攜帶參數(shù)的方式就是在url后面加上queryString。

post請(qǐng)求:向后臺(tái)發(fā)送比較重要的數(shù)據(jù)(登錄)、文件上傳。參數(shù)長(zhǎng)度沒(méi)有限制,攜帶參數(shù)的方式放在Request body中。

更詳細(xì)的get和post解釋可以看:GET和POST兩種基本請(qǐng)求方法的區(qū)別 這篇博客利用了很形象的例子解釋了這兩種請(qǐng)求方式之間的聯(lián)系。

tips:

get比post更不安全。因?yàn)間et會(huì)把請(qǐng)求參數(shù)直接顯示到url中

get跟post在技術(shù)上可以相互實(shí)現(xiàn)

一般情況下:get產(chǎn)生一個(gè)TCP數(shù)據(jù)包;post產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。

在HTTP協(xié)議中,向服務(wù)器發(fā)送一個(gè)請(qǐng)求分為三部分:第一是把數(shù)據(jù)放在url中,第二是把post請(qǐng)求(如果有)放在Request body中,第三是把數(shù)據(jù)放在head中。

1.5 請(qǐng)求頭常見(jiàn)參數(shù)

User-Agent:請(qǐng)求時(shí)顯示的瀏覽器名稱。后期爬蟲會(huì)經(jīng)常用到這個(gè),因?yàn)槲覀兲峁┡老x發(fā)送請(qǐng)求時(shí)默認(rèn)的User-Agent是python,所以我們需要改名字,讓服務(wù)器認(rèn)不出我們。

Referer:表名這個(gè)請(qǐng)求時(shí)從哪個(gè) url 跳轉(zhuǎn)過(guò)來(lái)的。一般也可以用來(lái)做反爬蟲技術(shù),因?yàn)橛行╉?yè)面必須是要從指定的 url 跳轉(zhuǎn)才可以訪問(wèn)。

cookie:暫時(shí)存儲(chǔ)網(wǎng)頁(yè)的信息。因?yàn)閔ttp協(xié)議是無(wú)狀態(tài)的,所謂的無(wú)狀態(tài)就比如當(dāng)同一個(gè)用戶發(fā)送兩次請(qǐng)求時(shí),服務(wù)器沒(méi)有能力知道這兩次請(qǐng)求是否來(lái)自同一個(gè)人,所以需要使用cookie來(lái)做標(biāo)識(shí),這樣每次訪問(wèn)的時(shí)候cookie就會(huì)跟服務(wù)器說(shuō),我就是那個(gè)靚仔。

1.6 常見(jiàn)狀態(tài)碼

200:一切正常

301:永久重定向。以后再訪問(wèn)此網(wǎng)址的時(shí)候都會(huì)跳轉(zhuǎn)到新的網(wǎng)址。

302:臨時(shí)重定向。在接下來(lái)一段時(shí)間,訪問(wèn)此網(wǎng)址的時(shí)候都會(huì)跳轉(zhuǎn)到新的網(wǎng)址。

404:資源不存在

403:權(quán)限不足

5開頭:服務(wù)器內(nèi)部出錯(cuò)(一般是代碼寫錯(cuò))

1.7 分析調(diào)試界面

在一個(gè)頁(yè)面中,按下F12或右鍵->檢查元素可以跳轉(zhuǎn)到開發(fā)者調(diào)試界面,開發(fā)者調(diào)試界面可以查看一些關(guān)于網(wǎng)站的一些信息。以后爬蟲需要經(jīng)常利用它進(jìn)行抓包,頁(yè)面的分析等操作。

控制臺(tái)的樣子一般長(zhǎng)這樣:

Elements:網(wǎng)頁(yè)的html源代碼內(nèi)容。

Console:控制臺(tái),用來(lái)進(jìn)行一些JS操作。

Source:網(wǎng)站所要用到的資源文件。

Network:查看該網(wǎng)頁(yè)向服務(wù)器發(fā)送了哪些請(qǐng)求。(常用)

1.8 urllib庫(kù)

urllib是python一個(gè)基本的網(wǎng)絡(luò)請(qǐng)求庫(kù),可以模擬瀏覽器行為,向指定服務(wù)器發(fā)送一個(gè)請(qǐng)求,并可以保存服務(wù)器返回的數(shù)據(jù)。在使用這個(gè)庫(kù)之前需要先導(dǎo)入from urllib import request

下面看看這個(gè)庫(kù)里面使用的一些函數(shù)吧:

urlopen函數(shù): 發(fā)送網(wǎng)絡(luò)請(qǐng)求,返回 Response 對(duì)象。

格式:urlopen(url,data=None)

參數(shù):

url:要請(qǐng)求的網(wǎng)址。默認(rèn)為get請(qǐng)求

data:請(qǐng)求參數(shù)。默認(rèn)值為None,如果設(shè)置了此值就變成post請(qǐng)求

from urllib import request # 1.導(dǎo)入urllib庫(kù)

url = 'https://www.baidu.com/baidu'

# 2.獲取Response對(duì)象

res = request.urlopen(url)

print(res.read()) # 獲取網(wǎng)頁(yè)源代碼

print(res.status) # 獲取返回狀態(tài)碼

urlretrieve函數(shù):將服務(wù)器的一個(gè)文件保存到本地

格式:urlretrieve(url,filename)

參數(shù):

url:要請(qǐng)求的網(wǎng)址。默認(rèn)為get請(qǐng)求

filename:保存到本地時(shí)文件的名字(可以指定路徑)

from urllib import request # 1.導(dǎo)入urllib庫(kù)

url = 'https://www.baidu.com'

request.urlretrieve(url, 'baidu.html')

此時(shí)你會(huì)發(fā)現(xiàn),當(dāng)前項(xiàng)目文件夾就多出了個(gè)baidu.html 的文件。那么如果你想把文件下載到指定的目錄可以request.urlretrieve(url, 'D://baidu.html') ,執(zhí)行代碼之后文件就跑到D盤下了。

此函數(shù)功能很強(qiáng)大,比如你想爬取漂亮美眉的圖片,可以寫個(gè)while循環(huán)然后寫好美眉圖片的路徑,那么你就可以為所欲為了。

request.Request類

前面的urlopen 是不知道如何偽裝的,只能傻傻的告訴服務(wù)器說(shuō):我是爬蟲,我要爬取你的信息,你給不給我,不給我就走了。這時(shí),“兇”一點(diǎn)的服務(wù)器就直接上來(lái)打它,MD,還沒(méi)見(jiàn)過(guò)這么囂張的爬蟲呢。

所以,如果我們要能更安全的爬取一些信息,我們需要作出一些偽裝,例如前面提到的User-Agent 。如果我們需要配置這些信息,那就需要使用到request.Request 。

from urllib import request

url = 'https://www.baidu.com/baidu'

# 設(shè)置請(qǐng)求頭

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '

'AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/82.0.4077.0 Safari/537.36'

}

# 偽裝User-Agent

req = request.Request(url, headers=headers)

res = request.urlopen(req) # 此時(shí)不再需要傳url

print(res.read().decode('utf-8')) # 將二進(jìn)制內(nèi)容解碼成utf-8

到了這一步,媽媽就不再擔(dān)心我因?yàn)椤懊帧北淮蛄恕?/p>

那么問(wèn)題來(lái)了,這個(gè)User-Agent 要怎么設(shè)置呢?

其實(shí)很簡(jiǎn)單,用瀏覽器隨便打開一個(gè)網(wǎng)頁(yè),然后按F12 進(jìn)入開發(fā)者調(diào)試工具,然后來(lái)到Network ,接著隨便點(diǎn)擊一個(gè)請(qǐng)求,找到請(qǐng)求頭,然后復(fù)制里面的User-Agent 到代碼中,然后改成字典的形式就可以了。

1.9 小實(shí)戰(zhàn)

Request類除了可以設(shè)置User-Agent還可以設(shè)置參數(shù)(data)跟請(qǐng)求方式(method)。

讓我們把以上內(nèi)容跟Request類結(jié)合爬取一下拉勾網(wǎng)吧。

首先隨便找到個(gè)可以分頁(yè)的地方(這里以爬取分頁(yè)信息為例),按F12 找到 Network 在眾多請(qǐng)求中找到獲取分頁(yè)信息的請(qǐng)求(在拉鉤網(wǎng)應(yīng)該是.json結(jié)尾且type為xhr 的請(qǐng)求),找到該請(qǐng)求之后你會(huì)發(fā)現(xiàn),這個(gè)請(qǐng)求的方式為post,

復(fù)制上面的referer ,因?yàn)槲野戳说诙?yè),所以他的referer的意思是從第一頁(yè)跳轉(zhuǎn)過(guò)來(lái)的。

復(fù)制User-Agent 偽裝下自己。

分析Form Data,我這里的是Google瀏覽器其他瀏覽器的方式大同小異??梢钥吹?/p>

有這樣的一些參數(shù):

first:true 表示是否第一次訪問(wèn)

pn:1 表示當(dāng)前的頁(yè)數(shù)。

kd:Python 搜索的職業(yè)是python

下面來(lái)看看代碼:

from urllib import request

from urllib import parse

url = 'https://www.lagou.com/guangzhou-zhaopin/Python/4/?filterOption=3&sid=4d3fa0ba0cc14b84a9e25164db9ca571'

# 設(shè)置請(qǐng)求頭和referer

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '

'AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/82.0.4077.0 Safari/537.36',

'referer': 'https://www.lagou.com/guangzhou-zhaopin/Python/4/?filterOption=3&sid=4d3fa0ba0cc14b84a9e25164db9ca571'

}

# 設(shè)置請(qǐng)求參數(shù),如這里設(shè)置請(qǐng)求第四頁(yè)的內(nèi)容

data = {

'first': 'false',

'pn': 4,

'kd': 'python'

}

# 設(shè)置POST請(qǐng)求,且設(shè)置POST請(qǐng)求的參數(shù)

req = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method='POST')

res = request.urlopen(req)

print(res.read().decode('utf-8'))

這里介紹parse.urlencode 方法,這個(gè)方法的作用就是幫我們將key:value這樣的鍵值對(duì)轉(zhuǎn)換成'key=value'這樣的字符串。

怎么樣,到了這一步是不是就小有成就了,這只是初步的爬取一個(gè)網(wǎng)頁(yè),經(jīng)過(guò)以后的學(xué)習(xí)就可以爬取自己想要的數(shù)據(jù),不僅僅是一個(gè)網(wǎng)頁(yè)啦,而是具體的文字啊,信息啊什么的,加油,讓我們一起努力!

小結(jié):

由于很多網(wǎng)站采取的都是ajax異步請(qǐng)求,所以找這些異步請(qǐng)求的時(shí)候一般找有ajax字眼并且是json文件的

爬蟲時(shí)能在網(wǎng)頁(yè)的請(qǐng)求頭中復(fù)制的就盡量在請(qǐng)求頭中復(fù)制。

由于以后這個(gè)爬蟲教程主要是學(xué)Request庫(kù)來(lái)進(jìn)行網(wǎng)絡(luò)爬取,所以在這里就不過(guò)多的介紹urllib 庫(kù)了。并且下章開始就使用Request庫(kù)了。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python3之urllib庫(kù)的使用總結(jié)
第 56 天:Python 爬蟲之 urllib 包基本使用
python3實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲(5)
分享一個(gè)簡(jiǎn)單的爬蟲案例,幾十行代碼爬取百度貼吧,原理簡(jiǎn)單易懂
Python|urllib庫(kù)的一些應(yīng)用
爬蟲 | urllib入門 糗事百科實(shí)戰(zhàn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服