python读取网页表格_使用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里面带的还有

标签,显然不是所想要的,因此需要将这里的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文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值