先匯入三個包:
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()
複製程式碼