天天看點

urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用

urllib的使用

簡介

  • 可以利用url打開網址,然後下載下傳網頁。是python自帶的一個爬蟲庫,你可以通過它模拟浏覽器行為給浏覽器返送請求,然後将浏覽器回報的頁面資料進行抓取

基本用法

  • 打開目标網址的方法

url:目标網址的位址

data:post送出的資料

timeout:逾時後不發送資料,參數以秒為機關

cafile和capath參數為HTTP請求一組信任的CA憑證(百度文庫對CA的介紹)cafile指向的就是CA憑證的的單個檔案,而capath是指向的是證書的檔案目錄。

cadefault:官方給出的說法是[該參數被忽略]。。。。好TNiang随意啊。老外。

context:這個參數也是有關CA憑證的,然後子3.6版本之後就不推薦用cafile和cadefault了,推薦用context。推薦使用

這個方法可以幫助你選擇系統承認的CA憑證。

上面的這些參數,url是必須要有的,其他都是選填。

隻要熟悉url,data,timeout參數就好了。至于CA認證,後面會說到。

該函數會傳回頁面的代碼和資料

  • 舉個栗子。。
from urllib import request #包的引入
res = request.urlopen(r'https://www.baidu.com')#打開目标頁面
page = res.read()#讀取傳回的頁面,注意資料傳回的是位元組流
page = page.decode('utf-8')#将位元組流頁面解碼成utf8格式
print(page)#列印資料檢視
           
  • 簡單的說幾個urlopen的傳回對象提供的方法,有這些也差不多夠用,不夠的去官網自己扒拉官方對應的位址

    1.read(),readline,readlines(),fileno(),close,這都是對HTTPResponse類型資料進行操作的。

    2.info()傳回HTTPMessage對象,也就是遠端伺服器給你的傳回的頭的資訊。

    3.getcode()傳回http狀态碼,就是200(請求成功),404(找不到目位址)之類的資訊,狀态碼有好多,可以出門去百度,了解下,一般2開頭的都挺好的。

使用Request

使用這個函數可以向網頁,送出請求,請求有post和get兩種,這個的差別和解釋我們後面再說。先看下參數的作用

url:目标位址。。。

data:需要送出的請求。。。

haders:一個字典,用來存放,送出的時候模拟浏覽器的頭資訊,在反爬蟲機制中很有用的。

method:請求方式。POST/GET

  • 舉個例子,自己把代碼拷貝下來試試。。
from url import request #庫的導入
url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'#目标位址
headers = {
     'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                   r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     'Connection': 'keep-alive'
  }#模拟的頭
req = request.Request(url, headers=headers)#送出請求,這時候的請求不帶資料。
page = request.urlopen(req).read()#同樣打我們擷取的頁面,然後讀取面資料
page = page.decode('utf-8')#将位元組流進行解碼
print(page)#列印擷取後的頁面。
           

簡單的解釋下

User-Agent :這個頭部可以攜帶如下幾條資訊:浏覽器名和版本号、作業系統名和版本号、預設語言

Referer:可以用來防止盜鍊。

這些就是為了讓那些伺服器認為你不是在用爬蟲,是人在操作,好多網址是不希望你大量大量的抓取人家資料的。

post請求資料

  • 在這裡給大家說一下GET和POST的差別,其實也好了解,POST比起GET來說比較安全,解釋如下:

    GET就是把你請求的參數放在了URL裡頭,POST是通過請求和body來傳遞參數,也就是前者你可以直覺的看到網頁的向伺服器請求資料的接口和方式,而post則會把請求的參數和參數的内容都隐藏。

  • GET請求網頁的方法也就是直接通路位址,就好,讀者可以自己親自試驗一下。POST的我給舉個例子。

    我這裡使用的是谷歌浏覽器。

    找個post類型的網頁。。。

    嗯。。http://httpbin.org…這個網址可以幫助你在學習爬蟲使用拿來練習使用。

    1.用谷歌打開是這樣的。

    urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用
    2.然後再點選HTTP Methods就會出現如圖的内容,再點選post就會看到如圖的内容。
    urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用
    3.然後你在點選 try it out然後再點選Excute然後你就看到了一堆展開,其中就會有你請求的位址(request url)和響應體(response body)。
    urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用
    4.編碼測試一下
from urllib import request,parse
url = "http://httpbin.org/post"#目标位址
data = {
	"1":"hahah",
	"2":"wulala"
}#要送出給頁面的字典
#這個時候需要注意了,大家還記得我們下載下傳頁面後需要解碼才可以使用嗎?
#這裡在送出的時候同樣我門需要把内容進行編碼成位元組流,然後送出部編碼的現象,自行觀察
data = parse.urlencode(data).encode("utf-8")#進行編碼操作
req = request.Request(url,data=data,method="POST")#送出請求
page = reuest.urlopen(req)#打開對應的頁面
page = page.read().decode("utf-8")#讀取頁面,讓後解碼列印
           

執行結果如下

urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用

異常處理

  • 程式在運作時很可能發生異常,當這些異常發生時,如果不做任何的處理,那麼程式就會在這時結束運作,死掉啦。
  • 處理方法:

    固定句式

try:
			#可能執行出錯語句
		except Exception as e:
			#出錯後。補救的方法,讓程式繼續執行
			#e 可以列印出來檢視異常出現的原因
           

需要注意的是可以有多個異常處理函數。。。

使用代理

urllib.request.ProxyHandler(proxies=None)

  • 每一個人或者公司在網絡中都有唯一的位址辨別符,也就是網絡IP。使用爬蟲抓取資料時,我們可能1秒10條或者更多的資料,這時候很多網址就會認為你是惡意攻擊的壞人,就會把你的IP關在小黑屋,然後我們可以使用代理的IP把我們真正的IP隐藏起來。
  • 我比較常用的是89ip代理(89代理位址)。。。不是打廣告大家可以使用别的,但是要注意,免費的代理有一定的時效性和不穩定的問題,當然花錢買的話就,,氪金玩家就會不一樣。
  • 寫個例子看下
from urllib import request
dic = "36.25.243.51:80"#代理IP和端口号
my_proxy = request.ProxyHandler({"http":dic})#設定代理ip
opener = request.build_opener(my_proxy)#挂載opener
request.install_opener(opener)#安裝opener 經過這3步成功将代理IP挂起來使用
print("使用的IP為{0}".format(my_proxy))
req = request.Request("http://www.baidu.com")
res = request.urlopen(req)
print(res.code)
print(res.read().decode("utf-8"))
           

部分結果

urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用

部分結果

urllib的使用-python爬蟲(二)- 合法爬取,拒絕牢飯。urllib的使用

代理IP有時候确實會出現被遠端主機拒絕通路或者強制關閉的問題這時候你就需要更換你的代理了。

我有一個建構代理池的方法,連接配接https://blog.csdn.net/qq_36389249/article/details/85111858

以上就是對于urllib的基本使用,資料擷取,有問題可在評論下留下交流。謝謝

手動滑稽