1. 程式人生 > >Python爬取黑龍江科技大學URL教務網站

Python爬取黑龍江科技大學URL教務網站

這個小東西從去年的寒假開始寫,直到現在才寫完,就是因為自己太懶了,不愛寫

大概的框架是用urllib庫中的requests寫的,本來想用scrapy來寫的,但是scrapy庫沒有安裝好,所以只能用前者來寫。

其實requests庫還是很方便的。

主要用來做POST請求。

總結一下遇到的幾個難點:

                  一. 如何模擬瀏覽器

                  二.如何用程式碼填寫表單

                  三.登陸後跳轉另一個介面無法保持會話資訊

                  四.獲取原始碼後如何提取資訊

                  五.如何將資訊儲存到Excel中

一.模擬瀏覽器

//模擬瀏覽器資訊 req.addheaders=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML,like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0")

二.填寫並提交表單

postdata = urllib.parse.urlencode({
    "zjh":賬號,
    "mm":"密碼"})

三.保持會話資訊需要用到http.cookiejar庫

//保持會話狀態

cjar = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))

四.從原始碼中提取資訊

這個最開始是用的正則表示式提取的,但因為網頁的原始碼實在是太亂了,(心中早已默唸一萬句MMP)費了好長時間也沒有找出一個適合這個網頁的表示式。所以又重新找到了另一個方法 --->BeautifulSoup庫,不得不說這個庫功能的強大,兩行程式碼就搞定了,只不過提取的資訊不是很完美,但也夠看了。                                                                                                                                 首先需要安裝BeautifulSoup庫,可以用 pip install BeautifulSoup 命令,但這個庫只是對python2.7版本支援,對於python3.6支援不是很好,會報錯,這時需要用到2to3.py來將BeautifulSoup庫升級為3版本的,具體使用方法

Python3匯入BeautifulSoup報錯

提取並過濾資訊                                                                                                                                                                                 

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml') #獲取網頁原始碼
s=soup.get_text()   #得到原始碼中的純文字內容
s1=s.split()    #切片,將內容中的 空格,換行,等去除

五.將提取後的資訊儲存Excel                                                                                        

這裡需要用到 xlwt、xlrd、xlutils三個庫,如果沒有安裝可以用pip命令安裝

xlwt用來新建Excel檔案,本來是想用它來實現追寫資訊的,但弄了好久都沒有成功,每次儲存後都會重新建立一個檔案覆蓋原來的資訊

所以後來用的xlrd+xlutils庫來儲存資訊

程式碼實現

#使用xlrd來開啟工作簿
xls=xlrd.open_workbook(r'Excel檔案路徑',formatting_info=True)    #開啟原工作簿,追寫檔案
xlsc=copy(xls)          #複製工作簿     formatting_info=True表示保留工作簿中的格式。
table=xlsc.get_sheet(0)
# 設定單元格的寬度
table.col(1).width=40*70
table.col(4).width=40*150
table.col(6).width=40*150
table.col(7).width=40*70
table.col(9).width=40*150
table.col(10).width=40*70
table.col(11).width=40*70
#寫入資料table.write(line,row,value)
table.write(0, 0, '年級')
table.write(0, 1, '學號')
table.write(0, 2, '姓名')
table.write(0, 3, '性別')
table.write(0, 4, '身份證號碼')
table.write(0, 5, '民族')
table.write(0, 6, '家庭地址')
table.write(0, 7, '出生日期')
table.write(0, 8, '政治面貌')
table.write(0, 9, '院系')
table.write(0, 10, '專業')
table.write(0, 11, '班級')
table.write(row, 0, grade)
table.write(row, 1, id)
table.write(row, 2, name)
table.write(row, 3, sex)
table.write(row, 4, id_card)
table.write(row, 5, nation)
table.write(row, 6, adress)
table.write(row, 7, borndate)
table.write(row, 8, politics_status)
table.write(row, 9, department)
table.write(row, 10, profession)
table.write(row, 11, _class)
xlsc.save('test1.xls')  #儲存xls檔案

對於不存在的賬號或者密碼不正確的需要丟擲異常,否則會報錯

爬取的時候最好用個延時函式,否則可能由於爬取過快導致被伺服器禁止爬取

具體程式碼