這篇文章主要介紹了在Python中使用mechanize模塊模擬浏覽器功能,包括使用cookie和設置代理等功能的實現,需要的朋友可以參考下
知道如何快速在命令行或者python腳本中實例化一個浏覽器通常是非常有用的。
每次我需要做任何關於web的自動任務時,我都使用這段python代碼去模擬一個浏覽器。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import mechanize import cookielib # Browser br = mechanize.Browser() # Cookie Jar cj = cookielib.LWPCookieJar() br.set_cookiejar(cj) # Browser options br.set_handle_equiv(True) br.set_handle_gzip(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) # Follows refresh 0 but not hangs on refresh > 0 br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) # Want debugging messages? #br.set_debug_http(True) #br.set_debug_redirects(True) #br.set_debug_responses(True) # User-Agent (this is cheating, ok?) 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')]現在你得到了一個浏覽器的示例,br對象。使用這個對象,便可以打開一個頁面,使用類似如下的代碼:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # Open some site, let's pick a random one, the first that pops in mind: r = br.open('http://google.com') html = r.read() # Show the source print html # or print br.response().read() # Show the html title print br.title() # Show the response headers print r.info() # or print br.response().info() # Show the available forms for f in br.forms(): print f # Select the first (index zero) form br.select_form(nr=0) # Let's search br.form['q']='weekend codes' br.submit() print br.response().read() # Looking at some results in link format for l in br.links(url_regex='stockrt'): print l如果你訪問的網站需要驗證(http basic auth),那麼:
?
1 2 3 4 # If the protected site didn't receive the authentication data you would # end up with a 410 error in your face br.add_password('http://safe-site.domain', 'username', 'password') br.open('http://safe-site.domain')由於之前使用了Cookie Jar,你不需要管理網站的登錄session。也就是不需要管理需要POST一個用戶名和密碼的情況。
通常這種情況,網站會請求你的浏覽器去存儲一個session cookie除非你重復登陸,
而導致你的cookie中含有這個字段。所有這些事情,存儲和重發這個session cookie已經被Cookie Jar搞定了,爽吧。
同時,你可以管理你的浏覽器歷史:
?
1 2 3 4 5 6 7 8 9 10 11 12 # Testing presence of link (if the link is not found you would have to # handle a LinkNotFoundError exception) br.find_link(text='Weekend codes') # Actually clicking the link req = br.click_link(text='Weekend codes') br.open(req) print br.response().read() print br.geturl() # Back br.back() print br.response().read() print br.geturl()下載一個文件:
?
1 2 3 4 # Download f = br.retrieve('http://www.google.com.br/intl/pt-BR_br/images/logo.gif')[0] print f fh = open(f)為http設置代理
?
1 2 3 4 5 6 # Proxy and user/password br.set_proxies({"http": "joe:[email protected]:3128"}) # Proxy br.set_proxies({"http": "myproxy.example.com:3128"}) # Proxy password br.add_proxy_password("joe", "password")但是,如果你只想要打開網頁,而不需要之前所有神奇的功能,那你可以:
?
1 2 3 4 5 6 7 # Simple open? import urllib2 print urllib2.urlopen('http://stockrt.github.com').read() # With password? import urllib opener = urllib.FancyURLopener() print opener.open('http://user:[email protected]').read()你可以通過 mechanize官方網站 , mechanize文檔 和ClientForm的文檔 了解更多。
原文來自:http://reyoung.me/index.php/2012/08/08/%E7%BF%BB%E8%AF%91%E4%BD%BF%E7%94%A8python%E6%
A8%A1%E4%BB%BF%E6%B5%8F%E8%A7%88%E5%99%A8%E8%A1%8C%E4%B8%BA/
——————————————————————————————
最後來聊下通過代碼訪問頁面時的一個很重要的概念和技術:cookie
我們都知道HTTP是無連接的狀態協議,但是客戶端和服務器端需要保持一些相互信息,比如cookie,有了cookie,服務器才能知道剛才是這個用戶登錄了網站,才會給予客戶端訪問一些頁面的權限。
比如用浏覽器登錄新浪微博,必須先登錄,登陸成功後,打開其他的網頁才能夠訪問。用程序登錄新浪微博或其他驗證網站,關鍵點也在於需要保存cookie,之後附帶cookie再來訪問網站,才能夠達到效果。
這裡就需要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一起,就能夠在請求網頁的時候附帶cookie。
具體做法,首先第一步,用firefox的httpfox插件,在浏覽器衷開始浏覽新浪微博首頁,然後登陸,從httpfox的記錄中,查看每一步發送了那些數據請求了那個URL;之後再python裡面,模擬這個過程,用urllib2.urlopen發送用戶名密碼到登陸頁面,獲取登陸後的cookie,之後訪問其他頁面,獲取微博數據。
cookielib模塊的主要作用是提供可存儲cookie的對象