python動態網頁爬取——四六級成績批量爬取

需求:html

  四六級成績查詢網站我所知道的有兩個:學信網(http://www.chsi.com.cn/cet/)和99宿舍(http://cet.99sushe.com/),這兩個網站採用的都是動態網頁。我使用的是學信網,好了,網站截圖以下:python

                                                        

網站的代碼以下:mysql

 1 <form method="get" name="form1" id="form1" action="/cet/query">
 2 
 3 <table border="0" align="center" cellpadding="0" cellspacing="0">
 4 <tr><td align="right">准考證號:</td><td align="left"><input name="zkzh" value="112008000463141" id="zkzh" type="text" size="18" maxlength="15" class="input_text input_t_l" /></td>
 5   <td align="left" class="font12 color666">請輸入15位準考證號</td>
 6 </tr>
 7 <tr><td align="right">姓名:</td><td align="left"><input name="xm" value="啊啊" id="xm" type="text" size="18" maxlength="50" class="input_text input_t_l" /></td>
 8   <td align="left" class="font12 color666">姓名超過3個字,可只輸入前3個</td>
 9 </tr>
10 
11 <tr><td align="center">&nbsp;</td>
12   <td colspan="2" align="left"><input type="submit" id="submitCET" class="btn_blue" value="查詢" /></td>
13   </tr>
14 </table>
15 </form>

由圖中能夠看出表單提交的連接爲/cet/query,即:http://www.chsi.com.cn/cet/query,好了,填寫表單和結果以下:web

                          

 

可是,點擊查看源代碼以後發現,沒有成績,即代碼還是上面那個,以後按F12查看代碼:sql

 1 <TBODY><TR>
 2 <TH>姓名:</TH>
 3 <TD>XXXX</TD></TR>
 4 <TR>
 5 <TH>學校:</TH>
 6 <TD>XXXXXX</TD></TR>
 7 <TR>
 8 <TH>考試類別:</TH>
 9 <TD>英語四級</TD></TR>
10 <TR>
11 <TH>准考證號:</TH>
12 <TD>120135151100101</TD></TR>
13 <TR>
14 <TH>考試時間:</TH>
15 <TD>2015年06月</TD></TR>總分:</TH><TD class=fontBold vAlign="top"><SPAN class=colorRed>403 </SPAN><BR><SPAN class=color666>聽力:</SPAN> 132 <BR><SPAN class=color666>閱讀:</SPAN> 147 <BR><SPAN class=color666>寫做與翻譯:</SPAN> 124 </TD></TR>

該代碼顯示了成績,能夠知道,該網站使用的是動態網頁,用的JavaScript或者Ajax.js仍是其餘的我就不知道了0.0。上面爲需求。數據庫

 

  前言:使用過BeautifulSoup爬取過,可是BeautifulSoup是爬取不了動態網頁的,上各類論壇找各類資料,用了n種東西,scapy,pyqt等等,走了真心很多彎路,不是不行,應該是我不會用,最終用了selenium和phantomjs,這兩個應該也是目前最流行的爬蟲模塊了吧。windows

1、導入selenium和phantomjs數組

  

1 from selenium import webdriver 2 
3 driver = webdriver.PhantomJS(executable_path='D:\phantomjs-2.1.1-windows\phantomjs.exe') 4 driver.get(url) 5 driver.find_element_by_id('zkzh').send_keys(i) 6 driver.find_element_by_id('xm').send_keys(xm) 7 driver.find_elements_by_tag_name('form')[1].submit()

  代碼說明:瀏覽器

  3.selenium能夠加載不少驅動,好比Chrome、FireFox等,這裏須要有這兩個瀏覽器和驅動才行,折騰了一下,網上說Phantomjs是較好的了服務器

  五、六、7分別是准考證號,姓名和提交

2、字符處理

提交以後就能夠直接查找了:

1 print driver.find_element_by_xpath("//tr[3]/td[1]").text 2 print driver.find_element_by_xpath("//tr[6]/td[1]").text

  代碼說明:

  1.查看姓名

  2.查看分數及其具體成績

  打印以後爲:

姓名 403 聽力 132 閱讀 147 寫做 142

  以後要對分數進行字符串處理,選取各部分的數字,這裏咱們採用re模塊:

1 import re 2 m = re.findall(r'(\w*[0-9]+)\w*', chuli2)

  其中m是數組,輸出的是["403","132","147","142"]

3、數據庫

  咱們學校也不知說很渣仍是人性化,反正公佈了全校的四六級准考證號,固然,是excel的,須要導入mysql數據庫,打開Excel以後,我發現微軟大法和Oracle真是牛逼啊,Excel365竟然有mysql workbench鏈接部分

 數據庫代碼以下:

 1 import MySQLdb  2 
 3 conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='cet', port=3306, charset='utf8')  4 cur = conn.cursor()  5 curr = conn.cursor()  6 cur.execute("select name from cet.cet where zkzh=(%s)" % i)  7 xm = cur.fetchone()[0]  8 print "Name is " + xm  9 sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % ( 10             ss, m[0], m[1], m[2], m[3], i) 11 cur.execute(sqltxt) 12 conn.commit() 13 cur.close() 14 conn.close()

  代碼說明:

  3.python鏈接數據庫代碼

  6.鏈接數據庫取得姓名部分

  9.這行我好無語啊,使用‘「+ss+」’這樣的寫法一直報錯,最終找了半天資料,這個寫法我不太喜歡,可是湊合着用吧。

  12.記得必定要提交事務!!!commit()!!!否則是沒有效果的

4、使用代理服務器(保留之後寫)

  運行了一段時間以後,大概抓了幾百人的吧,而後就出現要求驗證碼了,解決辦法只能處理驗證碼或者使用代理服務器了,這部分繼續增強學習再弄出來了↖(^ω^)↗

5、源代碼和效果

 1 # encoding=utf8
 2 
 3 import MySQLdb  4 import re  5 import time  6 
 7 from selenium import webdriver  8 
 9 # connect mysql,get zkxh and xm
10 conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='cet', port=3306, charset='utf8') 11 cur = conn.cursor() 12 curr = conn.cursor() 13 url = 'http://www.chsi.com.cn/cet/query'
14 
15 
16 def kaishi(i): 17     print i, 18     print " start"
19     try: 20         cur.execute("select name from cet.cet where zkzh=(%s)" % i) 21         xm = cur.fetchone()[0] 22         print "Name is " + xm 23         driver = webdriver.PhantomJS(executable_path='D:\phantomjs-2.1.1-windows\phantomjs.exe') 24  driver.get(url) 25         driver.find_element_by_id('zkzh').send_keys(i) 26         driver.find_element_by_id('xm').send_keys(xm) 27         driver.find_elements_by_tag_name('form')[1].submit() 28         driver.set_page_load_timeout(10) 29         leibie = driver.find_element_by_xpath("//tr[3]/td[1]").text 30         leibie2 = str(leibie.encode("utf-8")) 31         ss = ""
32         if leibie2.decode("utf-8") == '英語四級'.decode("utf-8"): 33             ss = 4
34         else: 35             ss = 6
36         # zongfen = driver.find_element_by_xpath("//tr[6]/th[1]").text
37         # print zongfen
38         # print "===="
39         chuli = driver.find_element_by_xpath("//tr[6]/td[1]").text 40         print chuli 41         chuli2 = str(chuli.encode("utf-8")) 42         m = re.findall(r'(\w*[0-9]+)\w*', chuli2) 43         sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % ( 44             ss, m[0], m[1], m[2], m[3], i) 45  cur.execute(sqltxt) 46  conn.commit() 47         print str(i) + " finish"
48     except Exception, e: 49         print e 50  driver.close() 51         time.sleep(10) 52  kaishi(i) 53 
54 
55 # for j1 in range(1201351511001, 1201351512154):
56 for j1 in range(1201351511007, 1201351512154): 57     for j2 in range(0, 3): 58         for j3 in range(0, 10): 59             j = str(j1) + str(j2) + str(j3) 60             if str(j2) + str(j3) == "00": 61                 print "0.0"
62             elif str(j2) + str(j3) == "29": 63                 kaishi(str(j1) + str(j2) + str(j3)) 64                 j4 = str(j1) + "30"
65  kaishi(j4) 66             else: 67  kaishi(j) 68 print "END!!!"
69 cur.close() 70 conn.close()

參考資料:

1.http://my.oschina.net/u/2420420/blog/489205?fromerr=MX68uajh

2.http://www.cnblogs.com/hearzeus/p/5157016.html

總結python的字符串處理細節真的很重要,動不動就輸出錯誤,還有IDE的編碼不同,記得還有個系統編碼,字符編碼,環境編碼,數據庫編碼等等都要一致!!!

ps後記:1.這幾天別人各類同窗聚會,然而,本身也老是那麼「幸運」,中學所碰到的班級對外特活躍特團結的樣子,可是初中高中畢業那麼久了,聚會是幾乎沒有過。。。。昨晚夢見了那些人那些事,也不知道他們怎麼樣了。昨天有一篇新聞報道了一大學一宿舍畢業20年,年年聚會的那樣子真好。

2.對於愛情的煩惱,莫過於明明很喜歡卻發現本身和她徹底不是一個「世界」的人,而後也不多找她說話,再而後就是用「嗯」「哦」來回復她的主動聊天,再而後聯繫愈來愈少,再而後連門都不敢出了,怕這個世界,有時雖然也會自嘲「活該孤獨終老」,可是有啥辦法呢?過年了,回到家,過着愈來愈淡的年,看着一同長大的人,吃着幾十年同樣的菜和飯,難不得矯情一下。

相關文章
相關標籤/搜索