模擬登入這塊我本來試著scrapy,但是我覺得真的很不靈活,倒騰了半天,也不行。後來還是用了我之前寫的**,用requests模組模擬。requests模組特別好用,比urllib2以及其他的都好用(至少我是這麼覺得地)。
模擬登入其實主要掌握了幾點,就很好下手。
要抓住真正要登入的url;
要拿到要post的表單資料form data,一般是以字典形式;
填寫好header,有的**可能會認證user-agent,host,referer等等請求頭。
下面就來逐步說說我寫模擬登入的過程。 想要拿到上面說到的資料,應該抓包分析,可以直接使用火狐的firebug外掛程式或者chrome瀏覽器直接分析。
目標**:
然後再看下提交的表單資料:
請求頭:
至此,我們已經拿到了所有需要的資料,現在開始模擬。
我們使用requests模組,該模組有session類,很管用。session類物件讓你能夠跨請求保持某些引數,它也會在同乙個 session 例項發出的所有請求之間保持cookies.也就是說用乙個session預設儲存了cookie,不用認為去處理cookie,很方便 。
def login(self,posturl,postdata):
self.build_opener()
postdata = urllib.urlencode(postdata)
request = urllib2.request(url=posturl,data=postdata,headers=self.headers)
#print self.opener.open(request)
resp = urllib2.urlopen(request).read()
print resp
self.session = requests.session()
r = self.session.post(posturl,data=postdata,headers=self.headers)
return dict(r.cookies) if not isinstance(r.cookies,dict) else r.cookies
注意我的**,session方法很簡單,而用urllib2方法也可以實現目的,但是很麻煩。我這裡的headers是我在類中定義的屬性,就不過細贅述。我這裡返回cookie,是為了給我的scrapy使用的,可忽略。
執行完上述操作後,我們就可以對需要登入才能訪問的介面進行爬取了。
def login_get_content(self,url,url_type='html'):
content = self.session.get(url,timeout = 15)
try:
#get original data brfore transferring unicode
content = content.content
except unicodeencodeerror:
content = content.text.encode('utf-8')
except unicodedecodeerror:
print 'test'
content = content.text
content = stringio(content)
#print content.read(),'test cstr'
if url_type == 'json':
return json.load(content)
elif url_type == 'xml':
return et.parse(content)
else:
return beautifulsoup(content,"html5lib")
我上面使用beautifulsoup進行頁面分析了。
看了上述操作,你肯定也會有感觸,requests很好用。
說了上面的模擬登入,有人會說太麻煩,每次都要自己尋找posturl,formdata等等一大堆,他們提出直接手動登入,然後獲取響應頭中的cookie,這樣很方便。但這最大的問題就是cookie是存在有效期,過期後就不好用了,而且作為程式設計師,怎麼能允許自己總是手動這麼low的方式存在呢,所以還是一勞永逸的好。獲得cookie之後,你別的地方也完全可以使用該cookie進行登入。我在scrapy中就將requests與其結合了。
class zxspider(crawlspider):
name = 'zhixing'
def start_requests(self):
spider = base_spider('zhixing',['host','origin','referer'])
posturl = ''
postdata = {
'username':'***',
'password':'*****',
'quickforward':'yes',
'handlekey':'ls'
cookies = spider.login(posturl,postdata)
url = ''
return [request(url,cookies=cookies,callback=self.parse_page,headers=spider.headers)]
def parse_page(self,response):
sel = selector(response)
r = sel.xpath('//td[@id="postmessage_10415551"]/text()').extract_first()
print r
return r
在scrapy中獲取到cookies之後,就可以隨心所欲的進行爬取啦!
爬蟲 模擬登入
在一些爬蟲中,需要用到賬號登入進入,才能看到需要爬取的內容,因此實現程式自動模擬登入非常有必要。目前大部分 的登入,都是使用表單提交的方法實現的,這一類 的模擬登入,相信度娘已經給出來的許多例項。還有一類 不是使用網頁自帶表單提交的方法,自己實現了js方法來登入,這就需要進行特別的模擬瀏覽器行為。本...
golang爬蟲登入
www.changtu.com 實現登入頁面的抓取,http請求登入,下面直接貼 實現get請求函式 func this myspider readurlbody string,error defer resp.body.close body,err ioutil.readall resp.body...
爬蟲 登入網頁
usr bin env python coding utf 8 file loginmmvoip.py author lucasysfeng revision 2014 06 13 14 26 11 description 登入 獲取cookie 訪問任意url import cookielib i...