前言:隨說學校教務提供API讀取成績,但得到權限要申請。正好剛剛學習爬蟲就本身來一下。
折騰了兩天看了無數的教程。犯下了無數傻瓜的錯誤(下面會說到。折磨的我不要不要的)
廢話不說了先上代碼html
import requests import sys reload(sys) sys.setdefaultencoding('utf8') hea = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36', 'Referer' : 'http://202.115.67.50/service/login.jsp'} url = 'http://202.115.67.50/servlet/UserLoginSQLAction' data ={ 'url':"../usersys/index.jsp", 'OperatingSystem':"", 'Browser':"", 'user_id':"XXXXXXXX", 'password':"123456", 'user_style':"modern", 'user_type':"student", 'btn1':"" } loginhtml = requests.post(url,data = data,headers = hea) url2 = 'http://202.115.67.50/student/score/MyScorePoint.jsp?QueryScoreType=FromTerm&term_value=71&B3=%E6%89%A7%E8%A1%8C%E6%9F%A5%E8%AF%A2' head1 = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'} scorehtml = requests.get(url2,cookies = loginhtml.cookies,headers=head1) print loginhtml.text
下面開始詳解代碼:python
import requests import sys reload(sys) sys.setdefaultencoding('utf8')
這段代碼是幹什麼的。這是一個更改python默認編碼方式的方法,python 默認編碼方式的方法是ascii編碼 因此而咱們從網上爬取的格式,以UTF-8爲主。因此才用這種將python的默認代碼改成
UTF-8.固然在requests庫也有一些方法也能夠作到,咱們下面再說。正則表達式
hea = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36', 'Referer' : 'http://202.115.67.50/service/login.jsp'} url = 'http://202.115.67.50/servlet/UserLoginSQLAction' data ={ 'url':"../usersys/index.jsp", 'OperatingSystem':"", 'Browser':"", 'user_id':"XXXXXXXX", 'password':"123456", 'user_style':"modern", 'user_type':"student", 'btn1':"" } loginhtml = requests.post(url,data = data,headers = hea)
咱們登陸一個網站就是向這個網站的主機提交一個表單
而HTML中提交表單用的是POST方法。request就有這個方法。
好了有個方法咱們怎麼知道要提交什麼內容呢?
(1)
這裏推薦一款firefox的插件HttpFox:
這是一款http協議分析插件,分析頁面請求和響應的時間、
內容、以及瀏覽器用到的COOKIE等。
他是這個樣子的:
點擊start開始記錄,stop中止。clear清屏。
(2)
好了咱們進入網頁打開HttpFox 點擊start
輸入帳戶 密碼 點擊登陸
這就是咱們登陸後的樣子 HttpFox收到了不少數據能夠很明顯的看到第一條的方法就是POST瀏覽器
選中第一條咱們能夠在下面的信息裏面看到她的各類信息
有Headers,cookies,query string,POST data,content
咱們提交的數據就在POST DATA中
咱們將其處理成字典模式的數據存在上面的data中並最終
傳給request中的data
(3)
下面是一個重要的問題咱們要把咱們的表單提交給誰呢。這是最重要的(我不會告訴你我一開始用的網頁是錯誤的已致好久都沒有成功,都是淚啊)
讓我在登陸界面右鍵查看源碼 crtl F 查找action
你會在action後面跟一個網址。這個action其實就是綁定界面中
那個登陸按鈕。點擊登陸後表單就是提交到這個網址的
隨意ok複製這個網址。固然你的補全她的主機名字
好比交大的就是
http://202.115.67.50/servlet/UserLoginSQLAction
(4)
你們能夠看到我還有一個hea的字典變量
這個是幹啥的?他就是提交headers的
在POST的提交項目中有一個就是headers
你們能夠看到這裏面有不少類型,我只是提交了其中的兩個
一個是「User-Agent」這個是用來將你的POST假裝成一個瀏覽器
主要說說第二個Referer 這個也是困擾了我好久,查閱無數的網頁,最終仍是在個人一個同窗的幫助下才解決了。一開始我沒有加這個key-value 由於網上的大部分爬蟲都只是提交了「User-Agent」.後來添加了這一項後能夠用了。上網搜了一下發現這是一種反爬蟲技術。referer是你填寫帳戶和密碼的網址。服務器檢查這一項看你是否是從那個網頁登陸過來的。服務器
OK目前咱們已經得到了足夠的信息終於能夠向服務器提交數據了cookie
loginhtml = requests.post(url,data = data,headers = hea)
把剛剛構造好的數據傳入函數 而後讓咱們POST吧。框架
網上大部分的request教程這句程序後面都跟了.text 或.content
例如:loginhtml = requests.post(url,data = data,headers = hea).text
此時你得到只是一個包含網頁內容的字符串,若是此時你調用loginhtml.cookies就會說沒有這個方法
(這個地方讓我調了快一天。查了無數網,不過到是學會了不少其餘東西,最終在看官方API的時候發現他後面怎麼沒有.text。一試能夠,那真是淚流滿面啊。唉原諒我這個python的初學者沒有意識到這一點)jsp
這以後你就能夠經過loginhtml.cookies來得到服務器給你的cookies了
並在這以後經過cookies來獲取登陸界面的信息了函數
url2 = 'http://202.115.67.50/student/score/MyScorePoint.jsp?QueryScoreType=FromTerm&term_value=71&B3=%E6%89%A7%E8%A1%8C%E6%9F%A5%E8%AF%A2' head1 = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'} scorehtml = requests.get(url2,cookies = loginhtml.cookies,headers=head1)
登陸後的網址一是能夠經過看源代碼,或是繼續用HTTPfox監控。當你點擊某個選項的時候就是發送一個GET請求,找到裏面的網址加上就好,或者用火狐的查看框架信息也能夠。
後記:得到網頁以後就能夠經過正則表達式或者Xpath來處理數據,這裏就不寫了。第一次寫模擬登陸的爬蟲,在最後成功的時候心裏仍是有點小激動的。但願我寫的這篇教程對你們都有幫助。post