在使用Python對一些網站的數據進行採集時,經常會遇到需要登錄的情況。這些情況下,使用FireFox等瀏覽器登錄時,自帶的調試器(快捷鍵F12)就可以看到登錄的時候網頁向服務器提交的信息,把這部分信息提取出來就可以利用Python 的 urllib2 庫結合Cookie進行模擬登錄然後採集數據,如以下代碼:
#coding=utf-8 import urllib import urllib2 import httplib import cookielib url = 'http://www.xxx.net/' cookie = cookielib.CookieJar() cj=urllib2.HTTPCookieProcessor(cookie) #設置登錄參數,使用瀏覽器的調試器等抓包工具得到 postdata=urllib.urlencode({'JSESSIONID':'1F616774D9548C1E8AF12A65B470B663', 'username':'admin','password':'admin'}) #生成請求 request=urllib2.Request(url, postdata) #設置代理 request.set_proxy('xx.xx.xx.xx:xx','http') #登錄 opener=urllib2.build_opener(cj) urllib2.install_opener(opener) html=opener.open(request) print html.read() #打開數據頁面開始採集數據 s = urllib2.urlopen('http://www.xx.net').read()
可以留意到,提交的數據包含了一個JSESSIONID參數,百度一下就知道,通常Tomcat服務器生成一個新的會話的時候就會產生這個ID,並且包含在登錄頁面的HEAD裏面,如下圖:
某些服務器使用固定一個JSESSIONID就可以重複登錄,但某些就不行,應該是服務器可以設置的。對於固定JSESSIONID可以登錄的,上面的代碼就可以應付了,但動態改變的就需要先獲取本次會話的JSESSIONID,然後再提交登錄:
#獲取Tomcat服務器產生的JSESSIONID request = urllib2.Request(url) set_cookie = urllib2.urlopen(request).info()['Set-Cookie'] json_id = set_cookie.split(';')[0]#JSESSIONID=3037DCDF69A6454FC525E38C41E6B611 json_id = json_id.split('=')[-1] print json_id