四六級(jí)成績(jī)查詢網(wǎng)站我所知道的有兩個(gè):學(xué)信網(wǎng)(http://www.chsi.com.cn/cet/)和99宿舍(http://cet.99sushe.com/),這兩個(gè)網(wǎng)站采用的都是動(dòng)態(tài)網(wǎng)頁(yè)。我使用的是學(xué)信網(wǎng),好了,網(wǎng)站截圖如下:
網(wǎng)站的代碼如下:
由圖中可以看出表單提交的鏈接為/cet/query,即:http://www.chsi.com.cn/cet/query,好了,填寫(xiě)表單和結(jié)果如下:
但是,點(diǎn)擊查看源代碼之后發(fā)現(xiàn),沒(méi)有成績(jī),即代碼仍是上面那個(gè),之后按F12查看代碼:
姓名: XXXX 學(xué)校: XXXXXX 考試類別: 英語(yǔ)四級(jí) 準(zhǔn)考證號(hào): 120135151100101 考試時(shí)間: 2015年06月總分: 403
聽(tīng)力: 132
閱讀: 147
寫(xiě)作與翻譯: 124
該代碼顯示了成績(jī),可以知道,該網(wǎng)站使用的是動(dòng)態(tài)網(wǎng)頁(yè),用的JavaScript或者Ajax.js還是其他的我就不知道了0.0。上面為需求。?
前言: 使用過(guò)BeautifulSoup爬取過(guò),但是BeautifulSoup是爬取不了動(dòng)態(tài)網(wǎng)頁(yè)的,上各種論壇找各種資料,用了n種東西,scapy,pyqt等等,走了真心不少?gòu)澛罚皇遣恍?,?yīng)該是我不會(huì)用,最終用了selenium和phantomjs,這兩個(gè)應(yīng)該也是目前最流行的爬蟲(chóng)模塊了吧。
一、導(dǎo)入selenium和phantomjs
from selenium import webdriver driver = webdriver.PhantomJS(executable_path='D:\phantomjs-2.1.1-windows\phantomjs.exe') driver.get(url) driver.find_element_by_id('zkzh').send_keys(i) driver.find_element_by_id('xm').send_keys(xm) driver.find_elements_by_tag_name('form')[1].submit()
代碼說(shuō)明:
3.selenium可以加載很多驅(qū)動(dòng),比如Chrome、FireFox等,這里需要有這兩個(gè)瀏覽器和驅(qū)動(dòng)才行,折騰了一下,網(wǎng)上說(shuō)Phantomjs是較好的了
5、6、7分別是準(zhǔn)考證號(hào),姓名和提交
二、字符處理
提交之后就可以直接查找了:
print driver.find_element_by_xpath("http://tr[3]/td[1]").text print driver.find_element_by_xpath("http://tr[6]/td[1]").text
代碼說(shuō)明:
1.查看姓名
2.查看分?jǐn)?shù)及其具體成績(jī)
打印之后為:
姓名 聽(tīng)力 閱讀 寫(xiě)作
之后要對(duì)分?jǐn)?shù)進(jìn)行字符串處理,選取各部分的數(shù)字,這里我們采用re模塊:
import re m = re.findall(r'(\w*[0-9]+)\w*', chuli2)
其中m是數(shù)組,輸出的是["403","132","147","142"]
三、數(shù)據(jù)庫(kù)
我們學(xué)校也不知說(shuō)很渣還是人性化,反正公布了全校的四六級(jí)準(zhǔn)考證號(hào),當(dāng)然,是excel的,需要導(dǎo)入mysql數(shù)據(jù)庫(kù),打開(kāi)Excel之后,我發(fā)現(xiàn)微軟大法和Oracle真是牛,Excel365居然有mysql workbench連接部分。
?數(shù)據(jù)庫(kù)代碼如下:
import MySQLdb conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='cet', port=3306, charset='utf8') cur = conn.cursor() curr = conn.cursor() cur.execute("select name from cet.cet where zkzh=(%s)" % i) xm = cur.fetchone()[0] print "Name is " + xm sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % ( ss, m[0], m[1], m[2], m[3], i) cur.execute(sqltxt) conn.commit() cur.close() conn.close()
代碼說(shuō)明:
3.python連接數(shù)據(jù)庫(kù)代碼
6.連接數(shù)據(jù)庫(kù)取得姓名部分
9.這行我好無(wú)語(yǔ)啊,使用‘“+ss+”'這樣的寫(xiě)法一直報(bào)錯(cuò),最終找了半天資料,這個(gè)寫(xiě)法我不太喜歡,但是湊合著用吧。
12.記得一定要提交事務(wù)!??!commit()?。。〔蝗皇菦](méi)有效果的
四、使用代理服務(wù)器(保留以后寫(xiě))
運(yùn)行了一段時(shí)間之后,大概抓了幾百人的吧,然后就出現(xiàn)要求驗(yàn)證碼了,解決辦法只能處理驗(yàn)證碼或者使用代理服務(wù)器了,這部分繼續(xù)加強(qiáng)學(xué)習(xí)再弄出來(lái)了?I(^ω^)?J
五、源代碼和效果
# encoding=utf8 import MySQLdb import re import time from selenium import webdriver # connect mysql,get zkxh and xm conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='cet', port=3306, charset='utf8') cur = conn.cursor() curr = conn.cursor() url = 'http://www.chsi.com.cn/cet/query' def kaishi(i): print i, print " start" try: cur.execute("select name from cet.cet where zkzh=(%s)" % i) xm = cur.fetchone()[0] print "Name is " + xm driver = webdriver.PhantomJS(executable_path='D:\phantomjs-2.1.1-windows\phantomjs.exe') driver.get(url) driver.find_element_by_id('zkzh').send_keys(i) driver.find_element_by_id('xm').send_keys(xm) driver.find_elements_by_tag_name('form')[1].submit() driver.set_page_load_timeout(10) leibie = driver.find_element_by_xpath("http://tr[3]/td[1]").text leibie2 = str(leibie.encode("utf-8")) ss = "" if leibie2.decode("utf-8") == '英語(yǔ)四級(jí)'.decode("utf-8"): ss = 4 else: ss = 6 # zongfen = driver.find_element_by_xpath("http://tr[6]/th[1]").text # print zongfen # print "====" chuli = driver.find_element_by_xpath("http://tr[6]/td[1]").text print chuli chuli2 = str(chuli.encode("utf-8")) m = re.findall(r'(\w*[0-9]+)\w*', chuli2) sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % ( ss, m[0], m[1], m[2], m[3], i) cur.execute(sqltxt) conn.commit() print str(i) + " finish" except Exception, e: print e driver.close() time.sleep(10) kaishi(i) # for j1 in range(1201351511001, 1201351512154): for j1 in range(1201351511007, 1201351512154): for j2 in range(0, 3): for j3 in range(0, 10): j = str(j1) + str(j2) + str(j3) if str(j2) + str(j3) == "00": print "0.0" elif str(j2) + str(j3) == "29": kaishi(str(j1) + str(j2) + str(j3)) j4 = str(j1) + "30" kaishi(j4) else: kaishi(j) print "END!!!" cur.close() conn.close()
總結(jié):python的字符串處理細(xì)節(jié)真的很重要,動(dòng)不動(dòng)就輸出錯(cuò)誤,還有IDE的編碼不一樣,記得還有個(gè)系統(tǒng)編碼,字符編碼,環(huán)境編碼,數(shù)據(jù)庫(kù)編碼等等都要一致。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
