使用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文件中。

《使用Python登陆网站读取表格数据》上的4个想法

    1. 这个得用PIP安装比较省事,否则麻烦,在WINDOWS下安装PIP一般没啥问题,你安装PYTHON时,自动安装了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注