python動(dòng)態(tài)網(wǎng)頁批量爬取
四六級(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)頁。我使用的是學(xué)信網(wǎng),好了,網(wǎng)站截圖如下:
網(wǎng)站的代碼如下:
<form method="get" name="form1" id="form1" action="/cet/query"> <table border="0" align="center" cellpadding="0" cellspacing="0"> <tr><td align="right">準(zhǔn)考證號(hào):</td><td align="left"><input name="zkzh" value="112008000463141" id="zkzh" type="text" size="18" maxlength="15" class="input_text input_t_l" /></td> <td align="left" class="font12 color666">請(qǐng)輸入15位準(zhǔn)考證號(hào)</td> </tr> <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> <td align="left" class="font12 color666">姓名超過3個(gè)字,可只輸入前3個(gè)</td> </tr> <tr><td align="center"> </td> <td colspan="2" align="left"><input type="submit" id="submitCET" class="btn_blue" value="查詢" /></td> </tr> </table> </form>
由圖中可以看出表單提交的鏈接為/cet/query,即:http://www.chsi.com.cn/cet/query,好了,填寫表單和結(jié)果如下:


但是,點(diǎn)擊查看源代碼之后發(fā)現(xiàn),沒有成績(jī),即代碼仍是上面那個(gè),之后按F12查看代碼:
<TBODY><TR> <TH>姓名:</TH> <TD>XXXX</TD></TR> <TR> <TH>學(xué)校:</TH> <TD>XXXXXX</TD></TR> <TR> <TH>考試類別:</TH> <TD>英語四級(jí)</TD></TR> <TR> <TH>準(zhǔn)考證號(hào):</TH> <TD>120135151100101</TD></TR> <TR> <TH>考試時(shí)間:</TH> <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>
該代碼顯示了成績(jī),可以知道,該網(wǎng)站使用的是動(dòng)態(tài)網(wǎng)頁,用的JavaScript或者Ajax.js還是其他的我就不知道了0.0。上面為需求。
前言:使用過BeautifulSoup爬取過,但是BeautifulSoup是爬取不了動(dòng)態(tài)網(wǎng)頁的,上各種論壇找各種資料,用了n種東西,scapy,pyqt等等,走了真心不少?gòu)澛?,不是不行,?yīng)該是我不會(huì)用,最終用了selenium和phantomjs,這兩個(gè)應(yī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()
代碼說明:
3.selenium可以加載很多驅(qū)動(dòng),比如Chrome、FireFox等,這里需要有這兩個(gè)瀏覽器和驅(qū)動(dòng)才行,折騰了一下,網(wǎng)上說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
代碼說明:
1.查看姓名
2.查看分?jǐn)?shù)及其具體成績(jī)
打印之后為:
姓名 聽力 閱讀 寫作
之后要對(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é)校也不知說很渣還是人性化,反正公布了全校的四六級(jí)準(zhǔn)考證號(hào),當(dāng)然,是excel的,需要導(dǎo)入mysql數(shù)據(jù)庫(kù),打開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()
代碼說明:
3.python連接數(shù)據(jù)庫(kù)代碼
6.連接數(shù)據(jù)庫(kù)取得姓名部分
9.這行我好無語啊,使用‘“+ss+”'這樣的寫法一直報(bào)錯(cuò),最終找了半天資料,這個(gè)寫法我不太喜歡,但是湊合著用吧。
12.記得一定要提交事務(wù)?。?!commit()?。?!不然是沒有效果的
四、使用代理服務(wù)器(保留以后寫)
運(yùn)行了一段時(shí)間之后,大概抓了幾百人的吧,然后就出現(xiàn)要求驗(yàn)證碼了,解決辦法只能處理驗(yàn)證碼或者使用代理服務(wù)器了,這部分繼續(xù)加強(qiáng)學(xué)習(xí)再弄出來了↖(^ω^)↗
五、源代碼和效果
# 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") == '英語四級(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í)例講解Python爬取網(wǎng)頁數(shù)據(jù)
- python爬蟲爬取網(wǎng)頁表格數(shù)據(jù)
- Python爬取網(wǎng)頁中的圖片(搜狗圖片)詳解
- Python爬蟲爬取一個(gè)網(wǎng)頁上的圖片地址實(shí)例代碼
- 淺談Python爬取網(wǎng)頁的編碼處理
- Python下使用Scrapy爬取網(wǎng)頁內(nèi)容的實(shí)例
- python爬取Ajax動(dòng)態(tài)加載網(wǎng)頁過程解析
- 在Python中利用Pandas庫(kù)處理大數(shù)據(jù)的簡(jiǎn)單介紹
- 淺談?dòng)肞ython實(shí)現(xiàn)一個(gè)大數(shù)據(jù)搜索引擎
- Python大數(shù)據(jù)之從網(wǎng)頁上爬取數(shù)據(jù)的方法詳解
相關(guān)文章
Python機(jī)器學(xué)習(xí)算法之決策樹算法的實(shí)現(xiàn)與優(yōu)缺點(diǎn)
決策樹(Decision Tree)是一種基本的分類與回歸方法,這篇文章主要給大家介紹了關(guān)于Python機(jī)器學(xué)習(xí)算法之決策樹算法實(shí)現(xiàn)與優(yōu)缺點(diǎn)的相關(guān)資料,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
python利用百度云接口實(shí)現(xiàn)車牌識(shí)別的示例
這篇文章主要介紹了python利用百度云接口實(shí)現(xiàn)車牌識(shí)別的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
python 實(shí)現(xiàn)dict轉(zhuǎn)json并保存文件
今天小編就為大家分享一篇python 實(shí)現(xiàn)dict轉(zhuǎn)json并保存文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
詳解vscode實(shí)現(xiàn)遠(yuǎn)程linux服務(wù)器上Python開發(fā)
這篇文章主要介紹了vscode實(shí)現(xiàn)遠(yuǎn)程linux服務(wù)器上Python開發(fā),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Django中使用Json返回?cái)?shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Django中使用Json返回?cái)?shù)據(jù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Python 中pandas.read_excel詳細(xì)介紹
這篇文章主要介紹了Python 中pandas.read_excel詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-06-06

