創建時間:2021-11-24
作者:在下小黃

一、小試牛刀:

1.1 怎樣扒網頁呢?

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

  • 真正的程序就兩行,執行如下命令查看運行結果,感受一下
    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=)- 看,這個網頁的源碼已經被我們扒下來了,是不是很酸爽?---## 二、常見的方法-  requset.urlopen(url,data,timeout)    -  第一個參數url即為URL,第二個參數data是訪問URL時要傳送的數據,第三個timeout是設置超時時間。    -  第二、三個參數是可以不傳送的,data默認為空None,timeout默認為 socket._GLOBAL_DEFAULT_TIMEOUT    -  第一個參數URL是必須要傳送的,在這個例子里面我們傳送了百度的URL,執行urlopen方法之后,返回一個response對象,返回信息便保存在這里面。 -  response.read()    - read()方法就是讀取文件里的全部內容,返回bytes類型-  response.getcode()    - 返回 HTTP的響應碼,成功返回200,4服務器頁面出錯,5服務器問題-  response.geturl()    - 返回 返回實際數據的實際URL,防止重定向問題-  response.info()    - 返回 服務器響應的HTTP報頭---## 三、Request對象- 其實上面的urlopen參數可以傳入一個request請求,它其實就是一個Request類的實例,構造時需要傳入Url,Data等等的內容。比如上面的兩行代碼,我們可以這么改寫```pythonfrom urllib.request import urlopenfrom urllib.request import Requestrequest = Request("http://www.baidu.com")response = urlopen(request)print(response.read().decode())

  • 運行結果是完全一樣的,只不過中間多了一個request對象,推薦大家這么寫,因為在構建請求時還需要加入好多內容,通過構建一個request,服務器響應請求得到應答,這樣顯得邏輯上清晰明確

四、Get 請求

  • 大部分被傳輸到瀏覽器的html,images,js,css, … 都是通過GET方法發出請求的。它是獲取數據的主要方法

  • 例如:www.baidu.com 搜索

  • Get請求的參數都是在Url中體現的,如果有中文,需要轉碼,這時我們可使用

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

五、 Post 請求

  • 我們說了Request請求對象的里有data參數,它就是用在POST里的,我們要傳送的數據就是這個參數data,data是一個字典,里面要匹配鍵值對

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

六、響應的編碼

  • 響應狀態碼

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

七、Ajax的請求獲取數據

  • 有些網頁內容使用AJAX加載,而AJAX一般返回的是JSON,直接對AJAX地址進行post或get,就返回JSON數據了

八、請求 SSL證書驗證

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

各位路過的朋友,如果覺得可以學到些什么的話,點個贊 再走吧,歡迎各位路過的大佬評論,指正錯誤,也歡迎有問題的小伙伴評論留言,私信。

每個小伙伴的關注都是本人更新博客的動力!!!
請微信搜索【 在下小黃 】文章更新將在第一時間閱讀 !

博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,并肩前行!