Python模組之urllib模組

Python老四發表於2020-10-30

Py2.x:

Urllib庫

Urllin2庫

Py3.x:

Urllib庫

變化:

 

在Pytho2.x中使用import urllib2——-對應的,在Python3.x中會使用import urllib.request,urllib.error。

在Pytho2.x中使用import urllib——-對應的,在Python3.x中會使用import urllib.request,urllib.error,urllib.parse。

在Pytho2.x中使用import urlparse——-對應的,在Python3.x中會使用import urllib.parse。

在Pytho2.x中使用import urlopen——-對應的,在Python3.x中會使用import urllib.request.urlopen。

在Pytho2.x中使用import urlencode——-對應的,在Python3.x中會使用import urllib.parse.urlencode。

在Pytho2.x中使用import urllib.quote——-對應的,在Python3.x中會使用import urllib.request.quote。

在Pytho2.x中使用cookielib.CookieJar——-對應的,在Python3.x中會使用http.CookieJar。

在Pytho2.x中使用urllib2.Request——-對應的,在Python3.x中會使用urllib.request.Request。

快速爬取一個網頁

import urllib.request

 

file=urllib.request.urlopen('http://www.baidu.com')

 

data=file.read() #讀取全部

 

dataline=file.readline() #讀取一行內容

 

fhandle=open("./1.html","wb") #將爬取的網頁儲存在本地

fhandle.write(data)

fhandle.close()

 

瀏覽器的模擬

應用場景:有些網頁為了防止別人惡意採集其資訊所以進行了一些反爬蟲的設定,而我們又想進行爬取。

解決方法:設定一些Headers資訊(User-Agent),模擬成瀏覽器去訪問這些網站。

 

import urllib.request

import urllib.parse

 

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

header = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'

}

 

request = urllib.request.Request(url, headers=header)

reponse = urllib.request.urlopen(request).read()

 

fhandle = open("./baidu.html", "wb")

fhandle.write(reponse)

fhandle.close()

 

代理伺服器的設定

應用場景:使用同一個IP去爬取同一個網站上的網頁,久了之後會被該網站伺服器遮蔽。

解決方法:使用代理伺服器。 (使用代理伺服器去爬取某個網站的內容的時候,在對方的網站上,顯示的不是我們真實的IP地址,而是代理伺服器的IP地址)

 

def use_proxy(proxy_addr,url):

import urllib.request

proxy=urllib.request.ProxyHandler({'http':proxy_addr})

opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)

urllib.request.install_opener(opener)

data=urllib.request.urlopen(url).read().decode('utf8')

return data

 

proxy_addr='61.163.39.70:9999'

data=use_proxy(proxy_addr,'http://www.baidu.com')

print(len(data))

 

Cookie的使用

應用場景:爬取的網頁涉及登入資訊。訪問每一個網際網路頁面,都是通過HTTP協議進行的,而HTTP協議是一個無狀態協議,所謂的無狀態協議即無法維持會話之間的狀態。

 

import urllib.request

import urllib.parse

import urllib.error

import http.cookiejar

 

url='http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=La2A2'

data={

'username':'zhanghao',

'password':'mima',

}

postdata=urllib.parse.urlencode(data).encode('utf8')

header={

'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'

}

 

request=urllib.request.Request(url,postdata,headers=header)

#使用http.cookiejar.CookieJar()建立CookieJar物件

cjar=http.cookiejar.CookieJar()

#使用HTTPCookieProcessor建立cookie處理器,並以其為引數構建opener物件

cookie=urllib.request.HTTPCookieProcessor(cjar)

opener=urllib.request.build_opener(cookie)

#將opener安裝為全域性

urllib.request.install_opener(opener)

 

try:

reponse=urllib.request.urlopen(request)

except urllib.error.HTTPError as e:

print(e.code)

print(e.reason)

 

fhandle=open('./test1.html','wb')

fhandle.write(reponse.read())

fhandle.close()

 

url2='http://bbs.chinaunix.net/forum-327-1.html' #開啟test2.html檔案,會發現此時會保持我們的登入資訊,為已登入狀態。也就是說,對應的登入狀態已經通過Cookie儲存。

reponse2=urllib.request.urlopen(url)

fhandle2=open('./test2.html','wb')

fhandle2.write(reponse2.read())

fhandle2.close()

 

相關文章