每次我需要做任何關於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
# 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()
|
你可以通過 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的對象,以便於與urllib2模塊配合使用來訪問Internet資源。例如可以利用本模塊的CookieJar類的對象來捕獲cookie並在後續連接請求時重新發送。coiokielib模塊用到的對象主要有下面幾個:CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
urllib模塊和urllib模塊類似,用來打開URL並從中獲取數據。與urllib模塊不同的是,urllib模塊不僅可以使用urlopen()函數還可以自定義Opener來訪問網頁。同時要注意:urlretrieve()函數是urllib模塊中的,urllib2模塊中不存在該函數。但是使用urllib2模塊時一般都離不開urllib模塊,因爲POST的數據需要使用urllib.urlencode()函數來編碼。
cookielib模塊一般與urllib2模塊配合使用,主要用在urllib2.build_oper()函數中作爲urllib2.HTTPCookieProcessor()的參數。使用方法如下面登錄人人網的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#! /usr/bin/env python
#coding=utf-8
import urllib2
import urllib
import 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( "http://www.renren.com/PLogin.do" ,post_data,headers)
content = opener. open (req)
print content.read().decode( "utf-8" ).encode( "gbk" )
|
http://www.crazyant.net/796.html Python使用cookielib和urllib2模擬登陸新浪微博並抓取數據
http://my.oschina.net/duhaizhang/blog/69342 urllib2模塊
https://docs.python.org/2/library/cookielib.html cookielib — Cookie handling for HTTP clients