學(xué)用python也有3個(gè)多月了,用得最多的還是各類爬蟲腳本:寫過抓代理本機(jī)驗(yàn)證的腳本,寫過在discuz論壇中自動(dòng)登錄自動(dòng)發(fā)貼的腳本,寫過自動(dòng)收郵件的腳本,寫過簡單的驗(yàn)證碼識別的腳本,本來想寫google music的抓取腳本的,結(jié)果有了強(qiáng)大的gmbox,也就不用寫了。
這些腳本有一個(gè)共性,都是和web相關(guān)的,總要用到獲取鏈接的一些方法,再加上simplecd這個(gè)半爬蟲半網(wǎng)站的項(xiàng)目,累積不少爬蟲抓站的經(jīng)驗(yàn),在此總結(jié)一下,那么以后做東西也就不用重復(fù)勞動(dòng)了。
1.最基本的抓站
import urllib2content = urllib2.urlopen('http://XXXX').read()2.使用代理服務(wù)器
這在某些情況下比較有用,比如IP被封了,或者比如IP訪問的次數(shù)受到限制等等。
import urllib2proxy_support = urllib2.ProxyHandler({'http':'http://XX.XX.XX.XX:XXXX'})opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)urllib2.install_opener(opener)content = urllib2.urlopen('http://XXXX').read()3.需要登錄的情況
登錄的情況比較麻煩我把問題拆分一下:
3.1 cookie的處理
import urllib2, cookielibcookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)urllib2.install_opener(opener)content = urllib2.urlopen('http://XXXX').read()是的沒錯(cuò),如果想同時(shí)用代理和cookie,那就加入proxy_support然后operner改為
opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)
3.2 表單的處理
登錄必要填表,表單怎么填?首先利用工具截取所要填表的內(nèi)容。
比如我一般用firefox+httpfox插件來看看自己到底發(fā)送了些什么包
這個(gè)我就舉個(gè)例子好了,以verycd為例,先找到自己發(fā)的POST請求,以及POST表單項(xiàng):

可以看到verycd的話需要填username,password,continueURI,fk,login_submit這幾項(xiàng),其中fk是隨機(jī)生成的(其實(shí)不太隨機(jī),看上去像是把epoch時(shí)間經(jīng)過簡單的編碼生成的),需要從網(wǎng)頁獲取,也就是說得先訪問一次網(wǎng)頁,用正則表達(dá)式等工具截取返回?cái)?shù)據(jù)中的fk項(xiàng)。continueURI顧名思義可以隨便寫,login_submit是固定的,這從源碼可以看出。還有username,password那就很顯然了。
好的,有了要填寫的數(shù)據(jù),我們就要生成postdata
import urllibpostdata=urllib.urlencode({ 'username':'XXXXX', 'password':'XXXXX', 'continueURI':'http://www.verycd.com/', 'fk':fk, 'login_submit':'登錄'})然后生成http請求,再發(fā)送請求:
req = urllib2.Request( url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/', data = postdata)result = urllib2.urlopen(req).read()
新聞熱點(diǎn)
疑難解答
圖片精選