Python爬蟲之urllib.request的使用

需要的模塊

urllib.request

 

獲取get一個請求

這裏以百度爲例

r = urllib.request.urlopen("http://www.baidu.com")

獲取之後我們輸出r可以發現r是一個對象

<http.client.HTTPResponse object at 0x000002AE92E36040>

可以使用read()方法將該對象內容讀出來,這裏只截取一部分

b'<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X

可以使用read().decode("utf-8")對上述內容進行解碼,解碼完畢後就是html代碼了

把這些內容粘貼到txt文件裏,把文件類型改爲html,之後打開,會發現跟百度一模一樣

 

獲取一個post請求

可以使用這個網站來測試post請求,httpbin.org

 

 我們使用這個HTTP Methods

 

點擊post後,點try it out

再點擊這個execute,就相當於我們訪問了這個網站,他返回的信息 ,就出現了

返回的信息爲

 上面使html代碼,包含我們的訪問方式,使用的瀏覽器的版本等等,這個Use-Agent就是使用的瀏覽器版本

就是說post請求,是當我們就收到一部分信息後,在我們做出反應後,服務器纔會將剩下的東西發給我們

如何用python獲取一個post請求呢?

具體做法如下,

import urllib.request
import urllib.parse

#由於urllib.request.urlopen 中data參數必須是一個字節對象、可迭代對象,所以要轉格式,這裏將信息轉 #爲可迭代對象
#封裝信息,並將封裝好的信息轉換爲字節對象,
data = bytes(urllib.parse.urlencode({"heallo":"world"}),encoding = "utf-8")


#/post就代表獲取post請求,data是附加信息
r = urllib.request.urlopen("http://httpbin.org/post",data = data)
'''
也可以用
r = urllib.request.urlopen("http://httpbin.org",data = data,method ="POST")

輸出結果
print(r.read().decode("utf-8"))

urllib.parse.urlencode用法詳細

 

urllib.request.urlopen函數原型如下:urllib.request.urlopen(urldata=None, [timeout, ]*cafile=Nonecapath=Nonecadefault=Falsecontext=None) 

<1>url是目標資源在網路中的位置。可以是一個表示URL的字符串(如:http://www.xxxx.com/);也可以是一個urllib.request對象

 

<2>data用來指明發往服務器請求中的額外的信息(如:在線翻譯,在線答題等提交的內容)。HTTP是python中實現的衆多網絡通信http、https、ftp等協議中,唯一一個             使用data 參數的,也就是說只有打開的是http網址的時候,自定義data參數纔會有作用。另外,官方API手冊介紹指出:

  1. data必須是一個字節數據對象(Python的bytes object)
  2. data必須符合標準the standard application/x-www-form-urlencoded format,怎麼得到這種標準結構的data呢?使用urllib.parse.urlencode()將自定義的data轉換成標準格式,而這個函數所能接收的參數類型是pyhon中的mapping object(鍵/值對,如dict) or a sequence of two-element tuples(元素是tuple的列表)。
  3. data也可以是一個可迭代的對象,這種情況下就需要配置response對象中的Conten-length,指明data的大小。
  4. data默認是None,此時以GET方式發送請求;當用戶給出data參數的時候,改爲POST方式發送請求

<3>cafile、capath、cadefault 參數:用於實現可信任的CA證書的HTTP請求。(基本上很少用)

  <4>context參數:實現SSL加密傳輸。(基本上很少用)

輸出結果爲

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "heallo": "world"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "12", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.8", 
    "X-Amzn-Trace-Id": "Root=1-5ead4267-7ae21e305363f551481d4195"
  }, 
  "json": null, 
  "origin": "xxx.xxx.xxx.xx",#ip 
  "url": "http://httpbin.org/post"
}

這個form就是我們給服務器發送的內容

這一點可以說明,如果有需要用戶登錄的網站,可以使用post的方式,將用戶名和密碼發過去

還有一點就是,在返回的信息裏,User-Agent裏顯示的是python,說明我們是以python瀏覽的這個網頁,某些網站會根據這個User-Agent來判斷是否是爬蟲,比如說豆瓣

 

如果我們直接獲取一個get請求

import urllib.request
url ='https://www.douban.com'
r = urllib.request.urlopen(url)
print(r.read())

輸出爲
  File "E:\學習\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "E:\學習\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 418: 

這個418就是說明,豆瓣根據User-Agent發現了你是一個爬蟲

所以我們要進行僞裝

我們手動瀏覽豆瓣,找到我們的user-Agent

 

#創建一個字典來存我們手動瀏覽時候的瀏覽器信息
headers ={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}


#目標網站
url ="https://www.douban.com"


我們需要一個方法把,headers信息封裝進去
req = urllib.request.Request(url =url,headers =headers)


封裝完之後,直接使用這個req對象
r = urllib.request.urlopen(req)
print(r.read().decode("utf-8"))

Urllib.request.Request()用法詳情

爲什麼urllib.request.urlopen可以使用req呢?

因爲它的url參數可以是一個string類型也可以是一個Request的對象

 

這時候就有輸出了

輸出結果僅展示部分

  11655 個成員
    </div>
    <li>
    <div class="pic">
        <a href="https://www.douban.com/group/402725/"><img src="https://img3.doubanio.com/f/shire/a1fdee122b95748d81cee426d717c05b5174fe96/pics/blank.gif" data-origin="https://img1.doubanio.com/view/group/sqxs/public/17fdb616ff143d8.jpg" alt="" width="48" /></a>
    </div>
    <div class="info">
      <div class="title">
        <a href="https://www.douban.com/group/402725/">記事本圓夢小組</a>

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章