1.爬取baidu
baidudemo.py
#!/usr/bin/python
#-- coding:gb18030 --
import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()
urllib2.urlopen
(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
Open the URL url, which can be either a string or a Request
object.
2.爬取baidu
#!/usr/bin/python
#-*- coding:gb18030 -*-
import urllib
import urllib2
request = urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
class urllib2.Request
(url[, data][, headers][, origin_req_host][, unverifiable])
This class is an abstraction of a URL request.
url should be a string containing a valid URL.
data may be a string specifying additional data to send to the server, or None
3.模擬登錄
#!/usr/bin/python
#-*- coding:gb18030 -*-
import requests
data={"userBean.loginName":"admin","userBean.loginPass":"52f9001b1e75069f3c8c8daac9961b8a"}
s=requests.session()
#s.post(url='http://10.50.x.x/portal/login_init.action',data=data) #失敗
s.post(url='http://10.50.x.x/admin/login_login.action',data=data)# 成功
r=s.get('http://10.50.x.x/admin/login_login.action')
print r.text
Python爬蟲教程——模擬登錄|Yiner in Python
Requests:Python的HTTP庫
4.模擬登錄
import urllib
import urllib2
values = {"userBean.loginName":"admin","userBean.loginPass":"52f9001b1e75069f3c8c8daac9961b8a"}
data = urllib.urlencode(values)
url = "http://10.50.x.x/admin/login_login.action"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()
urllib.urlencode(query[, doseq]):將dict或者包含兩個元素的元組列表轉(zhuǎn)換成url參數(shù)凫碌。例如 字典{'name': 'dark-bull', 'age': 200}將被轉(zhuǎn)換為"name=dark-bull&age=200"
5.帶驗證碼的模擬登錄:
思路:
a.先打開登陸頁面每币,獲得cookies。
b.再訪問驗證碼的地址。驗證碼是動態(tài)的,每次打開都不一樣。
c.識別驗證碼偎谁。這里就需要你處理、識別剛才得到的驗證碼纲堵。自己去找驗證碼(captcha)識別庫巡雨,python可以用 pytesser(這個庫是調(diào)用PIL來處理識別的) 、openc 之類的 或者可以人工識別然后手動輸入驗證碼席函。
d.構(gòu)造post請求數(shù)據(jù)(request data)和請求頭部(request head) 铐望,然后 將構(gòu)造的請求 post給網(wǎng)站
f.獲取 響應(yīng)(response)信息,并通過測試來驗證登陸是否成功茂附≌埽或者直接跳過a步驟:
參考:
用Python模擬登錄正方教務(wù)系統(tǒng)并抓取初始網(wǎng)頁的一些個人筆記
python爬蟲實戰(zhàn)之模擬正方教務(wù)系統(tǒng)登錄查詢成績
python刷課腳本(正方教務(wù)系統(tǒng))
教務(wù)系統(tǒng)爬蟲
key:
每次驗證碼都不同
![error] VirtualBox VM, 今天 at 下午3.27.00.png](http://upload-images.jianshu.io/upload_images/1423035-bbee7f98f581abb0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
HTTP Error 302:
成功應(yīng)該是返回200
編碼問題:
![] VirtualBox VM, 今天 at 下午3.58.35.png](http://upload-images.jianshu.io/upload_images/1423035-9c77238fb5522e2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
RadioButtionList1:學(xué)生
先把‘學(xué)生’以utf8進(jìn)行解碼,然后編碼成gbk营曼,最后再進(jìn)行url編碼乒验。
輸出:%D1%A7%C9%FA
先Post 訪問default3.aspx
然后再get訪問xsmainfs.aspx?xh=xxxx
還需要再訪問 xstop.aspx和xsleft.aspx
post數(shù)據(jù)到default3.aspx后會重定向到/xsmainfs.aspx?xh=xx
post數(shù)據(jù)到default3.aspx后會返回302狀態(tài)碼
同樣去訪問xsmainfs.aspx的時候也會返回302狀態(tài)碼蒂阱,正常情況下應(yīng)該是200
抓包觀察:
對比,就connection不同
302是什么录煤?
302重定向又稱之為302代表暫時性轉(zhuǎn)移(Temporarily Moved )鳄厌,英文名稱:302 redirect。 也被認(rèn)為是暫時重定向(temporary redirect)妈踊,一條對網(wǎng)站瀏覽器的指令來顯示瀏覽器被要求顯示的不同的URL了嚎,當(dāng)一個網(wǎng)頁經(jīng)歷過短期的URL的變化時使用。一個暫時重定向是一種服務(wù)器端的重定向廊营,能夠被搜索引擎蜘蛛正確地處理歪泳。
為什么返回302呢?
302不是錯誤, 是http code. 再header中, 會有Location: http://url.com, 告訴瀏覽器, 下一步的地址, 瀏覽器檢測到后, 跳轉(zhuǎn)到新地址http//url.com.
應(yīng)該要返回200才對
模擬登陸成功:
接下類要獲取個人信息的數(shù)據(jù)
- get方式:
xsxx.aspx?xh=xx&xh1=xxx - 獲取網(wǎng)頁
- 正則表達(dá)式提取數(shù)據(jù)
<span id="xh">14055301xx</span></td>
<span id="xm">姓名</span></td>
<span id="csrq">?出生日期</span></td>
<span id="xb">性別</span></td>
<span id="rxrq">入學(xué)日期</span></td>
<span id="mz">?民族</span></td>
<span id="zymc">專業(yè)名稱</span></td>
<span id="zyfx">專業(yè)方向</span></td>
<span id="xymc">學(xué)院名稱</span></td> <span id="bjmc">班級名稱</span></td>
<span id="sfzh">?身份證號</span></td> <span id="dqszj">?年級</span></td> <span id="ksh">考生號</span></P> <span id="xz">學(xué)制</span></td>
<span id="syszd">生源所在地</span></td>
<span id="zzmm">政治面貌</span></td>
<span id="xjzt">學(xué)籍狀態(tài)</span></td>
目標(biāo):
1.模塊化
2.存入數(shù)據(jù)庫
3.自動化識別驗證碼
google:python 正方教務(wù)系統(tǒng)
一堆。。舞痰。
【總結(jié)】Python 2.x中常見字符編碼和解碼方面的錯誤及其解決辦法
302:請求到的資源在一個不同的URL處臨時保存 處理方式:重定向到臨時的URL
HTTPError是URLError的子類,在你利用urlopen方法發(fā)出一個請求時荸哟,服務(wù)器上都會對應(yīng)一個應(yīng)答對象response假哎,其中它包含一個數(shù)字”狀態(tài)碼”。舉個例子鞍历,假如response是一個”重定向”舵抹,需定位到別的地址獲取文檔,urllib2將對此進(jìn)行處理劣砍。
其他不能處理的惧蛹,urlopen會產(chǎn)生一個HTTPError,對應(yīng)相應(yīng)的狀態(tài)嗎刑枝,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)香嗓。下面將狀態(tài)碼歸結(jié)如下:
還需要在代碼里面添加訪問xstop.aspx(帶header和cookie)
以確定是否真正模擬登陸成功
urllib2.Request()
urllib2用一個Request對象來映射你提出的HTTP請求,在它最簡單的使用形式中你將用你要請求的地址創(chuàng)建一個Request對象,通過調(diào)用urlopen并傳入Request對象装畅,將返回一個相關(guān)請求response對象靠娱,這個應(yīng)答對象如同一個文件對象,所以你可以在Response中調(diào)用.read()掠兄。
urllib2.build_opener()
同樣像云,可以使用build_opener,這是一個更加方便的函數(shù)蚂夕,用來創(chuàng)建opener對象迅诬,他只需要一次函數(shù)調(diào)用。
build_opener默認(rèn)添加幾個處理器婿牍,但提供快捷的方法來添加或更新默認(rèn)處理器侈贷。
其他的處理器handlers你或許會希望處理代理,驗證等脂,和其他常用但有點特殊的情況铐维。
install_opener 用來創(chuàng)建(全局)默認(rèn)opener。這個表示調(diào)用urlopen將使用你安裝的opener慎菲。
Opener對象有一個open方法。
Python:urllib 和urllib2之間的區(qū)別
cookielib和urllib2模塊相結(jié)合模擬網(wǎng)站登錄