創(chuàng)建時(shí)間:2021-11-24
作者:在下小黃

一、小試牛刀:

1.1 怎樣扒網(wǎng)頁呢?

  • 其實(shí)就是根據(jù)URL來獲取它的網(wǎng)頁信息,雖然我們?cè)跒g覽器中看到的是一幅幅優(yōu)美的畫面,但是其實(shí)是由瀏覽器解釋才呈現(xiàn)出來的,實(shí)質(zhì)它是一段HTML代碼,加 JS、CSS,如果把網(wǎng)頁比作一個(gè)人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。所以最重要的部分是存在于HTML中的,下面我們就寫個(gè)例子來扒一個(gè)網(wǎng)頁下來
"""創(chuàng)建時(shí)間:2021-11-24作者:小黃版本:v1.0"""from urllib.request import urlopen# 要訪問的地址url = "http://www.baidu.com"# 發(fā)送請(qǐng)求response = urlopen(url)# 讀取內(nèi)容# info = response.read()# 打印內(nèi)容# print(info)# 以字符串的形式輸出# print(info.decode())# 打印狀態(tài)碼,返回HTTP的響應(yīng)碼print("響應(yīng)碼為:",response.getcode())# 打印真實(shí)url,返回實(shí)際訪問的URLprint("請(qǐng)求的真實(shí)URL地址為:",response.geturl())# 打印響應(yīng)頭,返回HTTP響應(yīng)頭# print(response.info())

  • 真正的程序就兩行,執(zhí)行如下命令查看運(yùn)行結(jié)果,感受一下
    from urllib.request import urlopen

response = urlopen("http://www.baidu.com")
print(response.read().decode())

![image.png](https://s4.51cto.com/images/blog/202111/24163820_619df9fc7569641682.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)- 看,這個(gè)網(wǎng)頁的源碼已經(jīng)被我們扒下來了,是不是很酸爽?---## 二、常見的方法-  requset.urlopen(url,data,timeout)    -  第一個(gè)參數(shù)url即為URL,第二個(gè)參數(shù)data是訪問URL時(shí)要傳送的數(shù)據(jù),第三個(gè)timeout是設(shè)置超時(shí)時(shí)間。    -  第二、三個(gè)參數(shù)是可以不傳送的,data默認(rèn)為空None,timeout默認(rèn)為 socket._GLOBAL_DEFAULT_TIMEOUT    -  第一個(gè)參數(shù)URL是必須要傳送的,在這個(gè)例子里面我們傳送了百度的URL,執(zhí)行urlopen方法之后,返回一個(gè)response對(duì)象,返回信息便保存在這里面。 -  response.read()    - read()方法就是讀取文件里的全部內(nèi)容,返回bytes類型-  response.getcode()    - 返回 HTTP的響應(yīng)碼,成功返回200,4服務(wù)器頁面出錯(cuò),5服務(wù)器問題-  response.geturl()    - 返回 返回實(shí)際數(shù)據(jù)的實(shí)際URL,防止重定向問題-  response.info()    - 返回 服務(wù)器響應(yīng)的HTTP報(bào)頭---## 三、Request對(duì)象- 其實(shí)上面的urlopen參數(shù)可以傳入一個(gè)request請(qǐng)求,它其實(shí)就是一個(gè)Request類的實(shí)例,構(gòu)造時(shí)需要傳入U(xiǎn)rl,Data等等的內(nèi)容。比如上面的兩行代碼,我們可以這么改寫```pythonfrom urllib.request import urlopenfrom urllib.request import Requestrequest = Request("http://www.baidu.com")response = urlopen(request)print(response.read().decode())

  • 運(yùn)行結(jié)果是完全一樣的,只不過中間多了一個(gè)request對(duì)象,推薦大家這么寫,因?yàn)樵跇?gòu)建請(qǐng)求時(shí)還需要加入好多內(nèi)容,通過構(gòu)建一個(gè)request,服務(wù)器響應(yīng)請(qǐng)求得到應(yīng)答,這樣顯得邏輯上清晰明確

四、Get 請(qǐng)求

  • 大部分被傳輸?shù)綖g覽器的html,images,js,css, … 都是通過GET方法發(fā)出請(qǐng)求的。它是獲取數(shù)據(jù)的主要方法

  • 例如:www.baidu.com 搜索

  • Get請(qǐng)求的參數(shù)都是在Url中體現(xiàn)的,如果有中文,需要轉(zhuǎn)碼,這時(shí)我們可使用

    • urllib.parse.urlencode()
    • urllib.parse. quote()

五、 Post 請(qǐng)求

  • 我們說了Request請(qǐng)求對(duì)象的里有data參數(shù),它就是用在POST里的,我們要傳送的數(shù)據(jù)就是這個(gè)參數(shù)data,data是一個(gè)字典,里面要匹配鍵值對(duì)

  • 發(fā)送請(qǐng)求/響應(yīng)header頭的含義:
名稱含義
Accept告訴服務(wù)器,客戶端支持的數(shù)據(jù)類型
Accept-Charset告訴服務(wù)器,客戶端采用的編碼
Accept-Encoding告訴服務(wù)器,客戶機(jī)支持的數(shù)據(jù)壓縮格式
Accept-Language告訴服務(wù)器,客戶機(jī)的語言環(huán)境
Host客戶機(jī)通過這個(gè)頭告訴服務(wù)器,想訪問的主機(jī)名
If-Modified-Since客戶機(jī)通過這個(gè)頭告訴服務(wù)器,資源的緩存時(shí)間
Referer客戶機(jī)通過這個(gè)頭告訴服務(wù)器,它是從哪個(gè)資源來訪問服務(wù)器的。(一般用于防盜鏈)
User-Agent客戶機(jī)通過這個(gè)頭告訴服務(wù)器,客戶機(jī)的軟件環(huán)境
Cookie客戶機(jī)通過這個(gè)頭告訴服務(wù)器,可以向服務(wù)器帶數(shù)據(jù)
Refresh服務(wù)器通過這個(gè)頭,告訴瀏覽器隔多長時(shí)間刷新一次
Content-Type服務(wù)器通過這個(gè)頭,回送數(shù)據(jù)的類型
Content-Language服務(wù)器通過這個(gè)頭,告訴服務(wù)器的語言環(huán)境
Server服務(wù)器通過這個(gè)頭,告訴瀏覽器服務(wù)器的類型
Content-Encoding服務(wù)器通過這個(gè)頭,告訴瀏覽器數(shù)據(jù)采用的壓縮格式
Content-Length服務(wù)器通過這個(gè)頭,告訴瀏覽器回送數(shù)據(jù)的長度

六、響應(yīng)的編碼

  • 響應(yīng)狀態(tài)碼

  • 響應(yīng)狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有五種可能取值。
  • 常見狀態(tài)碼:
號(hào)碼含義
100~199表示服務(wù)器成功接收部分請(qǐng)求,要求客戶端繼續(xù)提交其余請(qǐng)求才能完成整個(gè)處理過程
200~299表示服務(wù)器成功接收請(qǐng)求并已完成整個(gè)處理過程。常用200(OK 請(qǐng)求成功)
300~399為完成請(qǐng)求,客戶需進(jìn)一步細(xì)化請(qǐng)求。例如:請(qǐng)求的資源已經(jīng)移動(dòng)一個(gè)新地址、常用302(所請(qǐng)求的頁面已經(jīng)臨時(shí)轉(zhuǎn)移至新的url)、307和304(使用緩存資源)
400~499客戶端的請(qǐng)求有錯(cuò)誤,常用404(服務(wù)器無法找到被請(qǐng)求的頁面)、403(服務(wù)器拒絕訪問,權(quán)限不夠)
500~599服務(wù)器端出現(xiàn)錯(cuò)誤,常用500(請(qǐng)求未完成。服務(wù)器遇到不可預(yù)知的情況)

七、Ajax的請(qǐng)求獲取數(shù)據(jù)

  • 有些網(wǎng)頁內(nèi)容使用AJAX加載,而AJAX一般返回的是JSON,直接對(duì)AJAX地址進(jìn)行post或get,就返回JSON數(shù)據(jù)了

八、請(qǐng)求 SSL證書驗(yàn)證

# 忽略SSL安全認(rèn)證context = ssl._create_unverified_context()# 添加到context參數(shù)里response = urllib.request.urlopen(request, context = context)

各位路過的朋友,如果覺得可以學(xué)到些什么的話,點(diǎn)個(gè)贊 再走吧,歡迎各位路過的大佬評(píng)論,指正錯(cuò)誤,也歡迎有問題的小伙伴評(píng)論留言,私信。

每個(gè)小伙伴的關(guān)注都是本人更新博客的動(dòng)力!!!
請(qǐng)微信搜索【 在下小黃 】文章更新將在第一時(shí)間閱讀 !

博客中若有不恰當(dāng)?shù)牡胤剑?qǐng)您一定要告訴我。前路崎嶇,望我們可以互相幫助,并肩前行!