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或者包含兩個(gè)元素的元組列表轉(zhuǎn)換成url參數(shù)。例如 字典{'name': 'dark-bull', 'age': 200}將被轉(zhuǎn)換為"name=dark-bull&age=200"
5.帶驗(yàn)證碼的模擬登錄:
思路:
a.先打開登陸頁面,獲得cookies。
b.再訪問驗(yàn)證碼的地址。驗(yàn)證碼是動(dòng)態(tài)的,每次打開都不一樣。
c.識別驗(yàn)證碼。這里就需要你處理、識別剛才得到的驗(yàn)證碼。自己去找驗(yàn)證碼(captcha)識別庫,python可以用 pytesser(這個(gè)庫是調(diào)用PIL來處理識別的) 、openc 之類的 或者可以人工識別然后手動(dòng)輸入驗(yàn)證碼。
d.構(gòu)造post請求數(shù)據(jù)(request data)和請求頭部(request head) ,然后 將構(gòu)造的請求 post給網(wǎng)站
f.獲取 響應(yīng)(response)信息,并通過測試來驗(yàn)證登陸是否成功。或者直接跳過a步驟:
參考:
用Python模擬登錄正方教務(wù)系統(tǒng)并抓取初始網(wǎng)頁的一些個(gè)人筆記
python爬蟲實(shí)戰(zhàn)之模擬正方教務(wù)系統(tǒng)登錄查詢成績
python刷課腳本(正方教務(wù)系統(tǒng))
教務(wù)系統(tǒng)爬蟲
key:
每次驗(yàn)證碼都不同
![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后會(huì)重定向到/xsmainfs.aspx?xh=xx
post數(shù)據(jù)到default3.aspx后會(huì)返回302狀態(tài)碼
同樣去訪問xsmainfs.aspx的時(shí)候也會(huì)返回302狀態(tài)碼,正常情況下應(yīng)該是200
抓包觀察:
對比,就connection不同
302是什么?
302重定向又稱之為302代表暫時(shí)性轉(zhuǎn)移(Temporarily Moved ),英文名稱:302 redirect。 也被認(rèn)為是暫時(shí)重定向(temporary redirect),一條對網(wǎng)站瀏覽器的指令來顯示瀏覽器被要求顯示的不同的URL,當(dāng)一個(gè)網(wǎng)頁經(jīng)歷過短期的URL的變化時(shí)使用。一個(gè)暫時(shí)重定向是一種服務(wù)器端的重定向,能夠被搜索引擎蜘蛛正確地處理。
為什么返回302呢?
302不是錯(cuò)誤, 是http code. 再header中, 會(huì)有Location: http://url.com, 告訴瀏覽器, 下一步的地址, 瀏覽器檢測到后, 跳轉(zhuǎn)到新地址http//url.com.
應(yīng)該要返回200才對
模擬登陸成功:
接下類要獲取個(gè)人信息的數(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.自動(dòng)化識別驗(yàn)證碼
google:python 正方教務(wù)系統(tǒng)
一堆。。。
【總結(jié)】Python 2.x中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
302:請求到的資源在一個(gè)不同的URL處臨時(shí)保存 處理方式:重定向到臨時(shí)的URL
HTTPError是URLError的子類,在你利用urlopen方法發(fā)出一個(gè)請求時(shí),服務(wù)器上都會(huì)對應(yīng)一個(gè)應(yīng)答對象response,其中它包含一個(gè)數(shù)字”狀態(tài)碼”。舉個(gè)例子,假如response是一個(gè)”重定向”,需定位到別的地址獲取文檔,urllib2將對此進(jìn)行處理。
其他不能處理的,urlopen會(huì)產(chǎn)生一個(gè)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用一個(gè)Request對象來映射你提出的HTTP請求,在它最簡單的使用形式中你將用你要請求的地址創(chuàng)建一個(gè)Request對象,通過調(diào)用urlopen并傳入Request對象,將返回一個(gè)相關(guān)請求response對象,這個(gè)應(yīng)答對象如同一個(gè)文件對象,所以你可以在Response中調(diào)用.read()。
urllib2.build_opener()
同樣,可以使用build_opener,這是一個(gè)更加方便的函數(shù),用來創(chuàng)建opener對象,他只需要一次函數(shù)調(diào)用。
build_opener默認(rèn)添加幾個(gè)處理器,但提供快捷的方法來添加或更新默認(rèn)處理器。
其他的處理器handlers你或許會(huì)希望處理代理,驗(yàn)證,和其他常用但有點(diǎn)特殊的情況。
install_opener 用來創(chuàng)建(全局)默認(rèn)opener。這個(gè)表示調(diào)用urlopen將使用你安裝的opener。
Opener對象有一個(gè)open方法。
Python:urllib 和urllib2之間的區(qū)別
cookielib和urllib2模塊相結(jié)合模擬網(wǎng)站登錄