在 Python 中編寫網頁自動化腳本時,能夠快速在命令列或腳本中實例化一個瀏覽器對象是非常實用的技能。mechanize 模組正是為此而生,它提供了高度擬真的瀏覽器行為模擬,支援 Cookie 管理、代理設定、表單提交、紅向處理等核心功能,讓你無需啟動真實瀏覽器即可完成複雜的網頁互動任務。
cookielib.LWPCookieJar 自動處理 Session Cookie,免去手動維護登入狀態的麻煩以下程式碼展示如何配置一個功能完整的瀏覽器對象 br:
import mechanize
import cookielib
# 建立瀏覽器實例
br = mechanize.Browser()
# 設定 Cookie Jar,自動儲存與重送 Session Cookie
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# 瀏覽器行為選項
br.set_handle_equiv(True) # 處理 HTTP-EQUIV 標頭
br.set_handle_gzip(True) # 支援 Gzip 解壓縮
br.set_handle_redirect(True) # 自動追蹤重導向
br.set_handle_referer(True) # 自動發送 Referer
br.set_handle_robots(False) # 忽略 robots.txt(視需求啟用)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) # 處理 Refresh
# 設定 User-Agent 偽裝為 Firefox
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
r = br.open('https://google.com')
html = r.read()
print html # 顯示原始碼
print br.title() # 顯示頁面標題
print r.info() # 顯示回應標頭
# 列出所有表單
for f in br.forms():
print f
# 選擇第一個表單(索引 0)
br.select_form(nr=0)
# 填寫欄位並提交
br.form['q'] = 'weekend codes'
br.submit()
print br.response().read()
br.add_password('https://safe-site.domain', 'username', 'password')
br.open('https://safe-site.domain')
# 點擊特定文字的連結
req = br.click_link(text='Weekend codes')
br.open(req)
print br.geturl()
# 返回上一頁
br.back()
print br.geturl()
f = br.retrieve('https://www.google.com.br/intl/pt-BR_br/images/logo.gif')[0]
print f
fh = open(f)
# 帳密代理
br.set_proxies({"http": "joe:password@myproxy.example.com:3128"})
# 一般代理
br.set_proxies({"http": "myproxy.example.com:3128"})
# 代理認證
br.add_proxy_password("joe", "password")
若僅需簡單抓取網頁內容,不需要完整瀏覽器模擬,可直接使用 urllib2 或 urllib:
# 簡單 GET
import urllib2
print urllib2.urlopen('https://stockrt.github.com').read()
# 帶認證
import urllib
opener = urllib.FancyURLopener()
print opener.open('https://user:password@stockrt.github.com').read()
HTTP 是無狀態協定,Cookie 成為客戶端與伺服器維持狀態的關鍵。以新浪微博為例,使用者登入後,伺服器回傳 Session Cookie,後續請求必須攜帶此 Cookie 才能存取受保護資源。
在 Python 中,cookielib 提供 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar 等類別,配合 urllib2.HTTPCookieProcessor 即可自動管理 Cookie:
import urllib2, urllib, cookielib
data = {"email": "用戶名", "password": "密碼"}
post_data = urllib.urlencode(data)
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
headers = {"User-agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
req = urllib2.Request("https://www.renren.com/PLogin.do", post_data, headers)
content = opener.open(req)
print content.read().decode("utf-8").encode("gbk")
此方式將 Cookie 自動儲存於 cj 中,後續請求會自動附帶,無需手動處理。