使用Python登陸網站讀取表格數據

編程語言 Python Excel HTML 大程哥 2017-06-09

使用Python登陸網站讀取表格數據

近期有經常使用的數據,需要登陸到某個網站,將其中的表格數據讀取出來,為了提高效率節省工作時間,決定寫一個程序,使用Python自動登陸到該網站然後將某日(參數)的數據讀取並存放於excel表格中。

1登陸網站

通過IE等瀏覽器登陸到一個網站比較簡單,輸入賬號、密碼,點擊確定就登陸到了一個網站,但是如果想實現自動化,就必須得通過http協議與服務器進行通信。常見的http協議工具有curl,由於curl使用比較麻煩,得自已處理像cookie之類的細節,這裡就直接使用Python的urllib庫。

首先使用wireShark抓包工具,分析登陸過程中傳輸的數據,登陸網站時是將用戶名和密碼(通常為MD5加密的密碼)post到一個目標頁面進行處理,如果用戶名和密碼正確,就會redirect到成功頁面。登陸成功後,返回的header中包括一個cookie,必須對該cookie正確處理,才能正常訪問登陸成功後的網站內容。

import urllib
import urllib2
import cookielib
from bs4 import BeautifulSoup

#登陸時檢驗賬戶的頁面
auth_url = ‘http://localhost/check.php’

#所需數據的頁面
data_url = ‘ http://localhost/data.php’

#用戶名和密碼
para={“name”:”user”,”password”:123}

#對參數進行編碼(常用於漢字)
post_data=urllib.urlencode(para)

#自動處理cookie的類
cookieJar=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
req=urllib2.Request(auth_url,post_data)
result = opener.open(req)

到此,就算登陸成功並保存登陸後的cookie了,為了以防萬一,可以打印result.status和result.reason,如果一功正常,那麼result.status就是200,result.reason就是OK。

2提供參數訪問某頁面

上一步已經登陸成功,根據參數訪問數據頁面,也是要將數據提交到一個具體的頁面,通過觀察數據的傳輸,可以發現要傳遞的參數。

para={“date”:”2015-11-10”}
post_data=urllib.urlencode(para)
post_data=urllib.urlencode(post_data)
result = opener.open(data_url +”?”+post_data)

到此,通過參數就能打開具體的數據頁面了,如果還不放心,同上面一樣,打印result.status和result.reason,看返回的結果。

3解析網頁中表格的數據

目標頁面比較簡單,就一個表格(使用的是傳統的table標籤,而不是div),為了順利得到裡面的數據,比如第幾行第幾列,那麼就得使用解析html的工具,網友推薦的是BeautifulSoup這個包,利用這個包來分析html文檔的樹形結構,很容易取得頁面的某個數據。前面已經導入了這個包,登陸成功,並且提交參數打開了所需數據的頁面,現在就對這個頁面進行解析:

#目標頁面是GB2312編碼,而Python默認是UTF-8的編碼,所以要指定編碼

soup = BeautifulSoup(result.read(), ‘html.parser’,from_encoding=’gb2312′)
dataDict={} #用於存放讀取數據的字典
iRow=1 #用於忽略第一行標題行的內容
for item in soup.find_all(‘tr’):
if iRow!=1:
if item.contents[1] not in list(dataDict): #第一列為姓名不能重複
dataDict[item.contents[1]]= (item.contents[2], item.contents[3])
iRow=iRow+1

實戰中發現,item.contents裡面帶的還有<td>標籤,顯然不是所想要的,因此需要將這裡的html標籤去掉,直接自定義一個函數就滿足需要了:

def myReplace(data=None):
dataStr=””
if data is None:
print “Error!”
else:
for i in data:
if i not in (‘<‘,’>’,’t’,’d’,’/’):
dataStr=dataStr+i
return dataStr.strip()

至此,表格中所有行的第一、二、三列都存入dataDict字典中,其中第一列為姓名,比較重要,也不重複,所以當key,等待寫入excel表格中。

4寫入excel

讀取並寫入excel表格,網上有很多介紹的包,比如xlrd/xlwt/openpyxl,實戰中發現前兩個包一個只能讀一個只能寫,即使有xlutils來連接這兩個包,但還是不方便;openpyxl能讀能寫就跟vba一樣,但是生成的表格電腦上看正常看,手機上不知道為什麼打不開(最終要在手機上看),所以最終使用win32com包通過com的方式調用excel,一切正常:

#最前面別忘了導入下面的兩個包:

import win32com.client
from win32com.client import Dispatch

#操作excel的類網上是現成的,這裡就不復制代碼了,類的名字是easyExcel,複製下來直接使用,會比較省事:

#打開模板(已經做好了格式,寫好了表頭,第一列是姓名)

xls = easyExcel(‘template.xlsx’)
for i in range(2,28): #第一行為標題,從第二行開始寫入;第一列是姓名,因此數據不能錯行。
xls.setCell(u’Sheet1′,i,1, dataDict [xls.getCell(u’Sheet1′,i,1)][0])
xls.setCell(u’Sheet1′,i,2, dataDict [xls.getCell(u’Sheet1′,i,1)][1])
xls.setCell(u’Sheet1′,i,3 ,dataDict [xls.getCell(u’Sheet1′,i,1)][2])
xls.save(newfilename) #另存為新的文件
xls.close()

最後一切順利,將數據成功讀取並保存到了excel文件中。

相關推薦

推薦中...