爬蟲初體驗——python爬取學院教師公開資訊并存入Excel表格
- 0 引言
- 1 單個教師資訊爬取
- 2 多個教師資訊爬取
- 3 將表存入excel表格中
- 4 總結
0 引言
最近學習了爬蟲技術,想自己寫個小程式練練手,于是選取了西南財經大學會計學院的教師資料頁面進行爬取,頁面如下(將照片打碼了)

1 單個教師資訊爬取
在我看來,如果要逐個爬取教師資訊,首先需要爬取單個教師的資訊,以陳磊副教授為例,界面如下(照片已打碼)

本個爬蟲專案只爬取姓名,行政職務,系別,職稱等資訊,
很多網站在申請訪問的時候沒有請求頭會不成功,或者回傳亂碼,所以需要寫一個Header,偽裝成瀏覽器進行訪問,
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
}
要獲取自己瀏覽器的header也比較容易,以谷歌瀏覽器為例,按下F12,切換到Network,重繪頁面后,任意選擇一項點擊,在最下方可以看到Request Header,這是瀏覽器的請求報頭,復制其中的User-Agent即可,

令url2等于該老師的網址,data賦值為Request庫中的get方法回傳的HTML網頁,第一個引數為要訪問的網址url2,timeout是訪問超時大于1秒就停止訪問并報錯(可要可不要,timeout的值也可以根據自己的需要修改),
url2 = 'https://kj.swufe.edu.cn/info/1506/9681.htm'
data = requests.get(url2,headers = headers,timeout = 1)
MyHtml = data.text
print(MyHtml)

得到的結果如上圖,發現亂碼,根據查詢資料,需要加上一行代碼,data.encoding = “UTF-8”,因為windows中文默認不是UTF-8,而網頁回傳的第二行中默認的編碼是UTF-8(第五行),修改后的本部分代碼如下,
url2 = 'https://kj.swufe.edu.cn/info/1506/9681.htm'
data = requests.get(url2,headers = headers,timeout = 1)
data.encoding = "utf-8"
MyHtml = data.text
print(MyHtml)
回傳的網頁原始碼如下

此時在結果中Ctrl+F,找到我們需要的部分的資訊,

這一部分就是我們需要爬取的部分,此時可以通過re正則運算式來處理 pat1 = re.compile(‘行政職務:(.*?) ’),這條陳述句的作用是找到行政職務:和 之間的全部內容,然后type_two.extend(pat1.findall(MyHtml))是把行政職務內容都放入到type_one這個串列之中,最后可以進行匯出,
這個地方有兩點需要注意的點,第一是若只想匹配1個或以上的中文字,則可以用[\u4e00-\u9fa5]+來代表,第二是如果要匹配換行,則使用\r\n,
pat = re.compile('<h2>([\u4e00-\u9fa5]+)</h2>\r\n')
pat1 = re.compile('行政職務:</b><span>(.*?) ')
pat2 = re.compile('系別:</b><span>(.*?) ')
pat3 = re.compile('職稱:</b><span>(.*?) ')
pat4 = re.compile('辦公電話:</b><span>(.*?) ')
pat5 = re.compile('Email:</b><span>(.*?)\r\n')
type_one.extend(pat.findall(MyHtml))
#print(type_one)
type_two.extend(pat1.findall(MyHtml))
#print(type_two)
type_three.extend(pat2.findall(MyHtml))
#print(type_three)
type_four.extend(pat3.findall(MyHtml))
#print(type_four)
type_five.extend(pat4.findall(MyHtml))
#print(type_five)
type_six.extend(pat5.findall(MyHtml))
#print(type_six)
將上面的#去掉,則可以進行測驗,看到底獲得了什么資訊,

獲取到的資訊與網頁上看到的一致,行政職務和電話兩行為空,
2 多個教師資訊爬取
通過對副教授網頁的初步判斷,副教授網頁滿足一個式子
https://kj.swufe.edu.cn/info/1506/’+str(i)+’.htm
最開始的時候,我想用遍歷的方法對每個副教授的資訊進行爬取,代碼塊如下:
for i in range(9600,9800):
url2 = 'https://kj.swufe.edu.cn/info/1506/'+str(i)+'.htm'
后來發現在此范圍內的網址不一定存在,9601是副教授,9602不一定是副教授,超時的話會自動停下來,所以這種遍歷的方法是不可取的,
于是我想了下,從目錄頁面進行下手,目錄頁面有各個老師頁面的超鏈接,于是對目錄頁面的原始碼進行回傳,方法同上,代碼如下,
#在索引頁對該職稱下所有老師的鏈接進行獲取
firsturl = 'https://kj.swufe.edu.cn/szyj1/fjs.htm'
webdata = requests.get(firsturl,headers = headers,timeout = 1)
webdata.encoding = "utf-8"
MyHtml = webdata.text
print(MyHtml)
在得到的結果中Ctrl+F,找到1506,得到的結果如下

此時用正則式對編號進行匹配,將匹配到的數值存入到fujiaoshou[ ]中,
pat = re.compile('a href="../info/1506/(.*?).htm')
fujiaoshou.extend(pat.findall(MyHtml))
對fujiaoshou[ ]進行print操作,證實這種想法可行,

使用for回圈,只改變編號的值,此時需要注意使用str(),即可完成對每一個老師的頁面進行遍歷,
for i in range(0,fujiaoshou.__len__()):
url2 = 'https://kj.swufe.edu.cn/info/1506/'+str(fujiaoshou[i])+'.htm'
#time.sleep(random.randint(10,12)) 如果爬大網站時需要用到,防止反爬蟲機制
data = requests.get(url2,headers = headers,timeout = 1)
data.encoding = "utf-8"
MyHtml = data.text
pat = re.compile('<h2>([\u4e00-\u9fa5]+)</h2>\r\n')
pat1 = re.compile('行政職務:</b><span>(.*?) ')
pat2 = re.compile('系別:</b><span>(.*?) ')
pat3 = re.compile('職稱:</b><span>(.*?) ')
pat4 = re.compile('辦公電話:</b><span>(.*?) ')
pat5 = re.compile('Email:</b><span>(.*?)\r\n')
type_one.extend(pat.findall(MyHtml))
#print(type_one)
type_two.extend(pat1.findall(MyHtml))
#print(type_two)
type_three.extend(pat2.findall(MyHtml))
#print(type_three)
type_four.extend(pat3.findall(MyHtml))
#print(type_four)
type_five.extend(pat4.findall(MyHtml))
#print(type_five)
type_six.extend(pat5.findall(MyHtml))
#print(type_six)
dict = {'名字':type_one,
'行政職務':type_two,
'系別':type_three,
'職稱':type_four,
'辦公電話':type_five,
'Email':type_six}
new_frame = pd.DataFrame(dict)
print(new_frame)
得到的部分結果如下

3 將表存入excel表格中
代碼如下
# 創建一個workbook 設定編碼
workbook = xlwt.Workbook(encoding = 'utf-8')
# 創建一個worksheet
worksheet = workbook.add_sheet('會計學院副教授名冊')
# 寫入excel
# 引數對應 行, 列, 值
worksheet.write(0,0,'名字') #在1行1列寫名字
worksheet.write(0,1,'行政職務') #在1行2列寫行政職務
worksheet.write(0,2,'系別') #在1行3列寫系別
worksheet.write(0,3,'職稱') #在1行4列寫職稱
worksheet.write(0,4,'辦公電話') #在1行5列寫辦公電話
worksheet.write(0,5,'Email') #在1行6列寫Email
for i in range(1,fujiaoshou.__len__()):
worksheet.write(i,0,new_frame['名字'][i-1])
worksheet.write(i,1,new_frame['行政職務'][i-1])
worksheet.write(i,2,new_frame['系別'][i-1])
worksheet.write(i,3,new_frame['職稱'][i-1])
worksheet.write(i,4,new_frame['辦公電話'][i-1])
worksheet.write(i,5,new_frame['Email'][i-1])
# 保存
workbook.save('會計學院老師名冊.xls')
結果如下

4 總結
經過這次爬蟲程式的撰寫,我對爬蟲的機制與技巧有了初步的了解,
1、爬蟲是根據網頁原始碼的特點進行匹配,匹配到了我們需要的資訊進行保存,重點就是找到匹配資訊的格式,寫出正確的正則式進行匹配,
2、爬蟲需要對網址的格式進行判斷, 遍歷是一種很好的方法(比如爬取淘寶評論,以及一些網址有規律的頁面時),遍歷不可取的時候,則需要考慮以其他方式獲取所有頁面的資訊,此時目錄是一個很好的切入點,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254947.html
標籤:python
