urllib庫的常見用法

小潘東發表於2017-12-14

先匯入三個包:

import urllib.request
import urllib.parse
import http.cookiejar
複製程式碼

最簡單的urlopen()

url = "http://www.baidu.com"         
response = urllib.request.urlopen(url)
print(response.read())
複製程式碼

1. 構造headers

user_agent = ''
cookie = ''
referer = ''
host = ''
content_type = ''
複製程式碼

2. 構造Request例項物件

url = 'http://www.baidu.com'
values = {'name' : 'Michael Foord',
          'location' :'Northampton',
          'language' :'Python' }
headers={'User-Agent':user_agent,'Cookie':cookie,'Referer':referer,'Host':host,'Content-Type':content_type}
複製程式碼

3. HTTP高階方法

①使用Proxy代理

proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
opener = urllib.request.build_opener(proxy_handler)
複製程式碼

②使用cookiejar

cookie_jar = http.cookiejar.CookieJar()
cookie_jar_handler = urllib.request.HTTPCookieProcessor(cookiejar=cookie_jar)

opener.add_handler(cookie_jar_handler)
複製程式碼

③傳送

# 1.安裝全域性opener,然後利用urlopen開啟url   
urllib.request.install_opener(opener)                   
response = urllib.request.urlopen(url)

# 2.直接利用opener例項開啟url:
response = opener.open(url)
複製程式碼

4. 抓取網頁

data = urllib.parse.urlencode(values).encode('utf-8')  

req = urllib.request.Request(url,data,headers)
#或req.add_header('Referer', 'http://www.baidu.com')
#  req.add_header('Origin', 'https://passport.weibo.cn')
#  req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X)...')

response = urllib.request.urlopen(req,timeout=10)
the_page = response.read().decode('utf-8')
複製程式碼

或者這樣:

data = urllib.parse.urlencode({"act": "login", "email": "xianhu@qq.com", "password": "123456"})
request1 = urllib.request.Request(url,data=data,headers)    # POST方法
request2 = urllib.request.Request(url+"?%s" % data)         # GET方法
複製程式碼



其他方法

#抓取網頁中的圖片:同樣適用於抓取網路上的檔案。右擊滑鼠,找到圖片屬性中的地址,然後進行儲存。
response = urllib.request.urlopen("http://ww3.sinaimg.cn/large/7d742c99tw1ee.jpg",timeout=120)
with open("test.jpg", "wb") as file_img:
    file_img.write(response.read())
複製程式碼

# HTTP認證:即HTTP身份驗證
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()     # 建立一個PasswordMgr
password_mgr.add_password(realm=None, uri=url, user='username', passwd='password')   # 新增使用者名稱和密碼
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)         # 建立HTTPBasicAuthHandler
opener = urllib.request.build_opener(handler)                       # 建立opner
response = opener.open(url, timeout=10)                             # 獲取資料
複製程式碼

gzip壓縮: 在header中加入:'request.add_header('Accept-encoding', 'gzip')' 這是關鍵:建立Request物件,新增一個 Accept-encoding 頭資訊告訴伺服器你能接受 gzip 壓縮資料

然後就是解壓縮資料:

import StringIO
import gzip

compresseddata = f.read() 
compressedstream = StringIO.StringIO(compresseddata)
gzipper = gzip.GzipFile(fileobj=compressedstream) 
print gzipper.read()
複製程式碼

多執行緒爬取:

from threading import Thread
from Queue import Queue
from time import sleep
# q是任務佇列
#NUM是併發執行緒總數
#JOBS是有多少任務
q = Queue()
NUM = 2
JOBS = 10
#具體的處理函式,負責處理單個任務
def do_somthing_using(arguments):
    print arguments
#這個是工作程式,負責不斷從佇列取資料並處理
def working():
    while True:
        arguments = q.get()
        do_somthing_using(arguments)
        sleep(1)
        q.task_done()
#fork NUM個執行緒等待佇列
for i in range(NUM):
    t = Thread(target=working)
    t.setDaemon(True)
    t.start()
#把JOBS排入佇列
for i in range(JOBS):
    q.put(i)
#等待所有JOBS完成
q.join()
複製程式碼

相關文章