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版本的,具體使用方法
提取並過濾資訊
from bs4 import BeautifulSoupsoup=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檔案
對於不存在的賬號或者密碼不正確的需要丟擲異常,否則會報錯。
爬取的時候最好用個延時函式,否則可能由於爬取過快導致被伺服器禁止爬取