最近学习python,为了巩固一下学过的知识,花了半天(主要还是因为自己正则表达式不熟)写了个小脚本来抓取一个网站上的投票信息,排名后进行输出。

抓取的网站网址是http://www.mudidi.net/topic-yinghuhuodong.html。我先在网站首页点了个查看源码,发现并没有下面的投票部分信息,颇为不解,咨询了一个PHP大牛同学,原来那部分是一个嵌套页面,有另外一个地址http://www.mudidi.net//toupiao/vote3.asp?id=2,真是才疏学浅,自惭形愧啊。

找到真实地址后,就可以提取页面信息了:

 # 获取页面数据
def getUrlRespHtml():
url = 'http://www.mudidi.net//toupiao/vote3.asp?id=2'
req = urllib2.Request(url)
resp = urllib2.urlopen(req)
respHtml = resp.read()
# 由于存在汉字,将页面转码成utf-8
respHtml = respHtml.decode('gbk').encode('utf-8')
return respHtml

这里写了个函数,调用了urllib2这个库。最开始版本并没有转码这一步,但是结果会造成提取出的汉字都是乱码,查了好多资料,才知道需要转码,再次感叹才疏学浅,对网络编程真是没什么经验。

提取出网页信息后,就需要对信息进行处理。由于网页信息中我们需要的信息格式都是相同的,如下所示:

 <div class="tp">
<form action="vote_pass.asp" method="post" name="add">
<div align="center" style="white-space:now=rap; overflow:hidden;width:200px;font-size:13px;margin-top:0px;margin-bottom:10px;">安康山水 美哉瀛湖
<label>
<input type="hidden" name="id" value="1"/>
</label>
</div>
<div align="center" style="margin-top:0px;margin-bottom:10px;">NO1 作者:飞扬古</div>
<div align="center" style="margin-top:0px;color:#990000; font-weight:bold; font-size:14px; font-family:'Times New Roman', Times, serif;margin-top:0px;margin-bottom:7px;">票数:23</div>
<div align="center" style="">
<input type="image" name="button" src="vote1.gif" />
</div>
</form>
</div>

则需要写正则表达式匹配这一段落。我们需要的信息包括标语(如上所示的“安康山水 美哉瀛湖”)、ID(如上所示的NO1)、作者、票数。

我首先想到的是findall()函数,可以得到符合条件的列表,而且可以直接提取出我们需要的信息。可是无论我怎么写正则表达式都无法得到想要的结果。然后我就写了这么个正则表达式:“<form.*?</form>”,然后调用findall()函数,直接把所有的<form></form>段匹配了出来,得到了完整的格式(以上面的HTML代码为例):

“<form action="vote_pass.asp" method="post" name="add">\r\n  <div align="center" style="white-space:now=rap; overflow:hidden;width:200px;font-size:13px;margin-top:0px;margin-bottom:10px;">安康山水 美哉瀛湖\r\n      <label>\r\n      <input type="hidden" name="id"  value=""/>\r\n      </label>\r\n    </div>\r\n\t<div align="center" style="margin-top:0px;margin-bottom:10px;">NO 作者:飞扬古</div>\r\n\t<div align="center" style="margin-top:0px;color:#990000; font-weight:bold; font-size:14px; font-family:\'Times New Roman\', Times, serif;margin-top:0px;margin-bottom:7px;">票数:</div>”。

将这一段改成正则表达式,我直接把我想要提取的地方(红色部分)改为(.*),就可以得到想要的信息:

“<form action="vote_pass.asp" method="post" name="add">\r\n  <div align="center" style="white-space:now=rap; overflow:hidden;width:200px;font-size:13px;margin-top:0px;margin-bottom:10px;">(.*)\r\n      <label>\r\n      <input type="hidden" name="id"  value="(.*)"/>\r\n      </label>\r\n    </div>\r\n\t<div align="center" style="margin-top:0px;margin-bottom:10px;">NO(.*) 作者:(.*)</div>\r\n\t<div align="center" style="margin-top:0px;color:#990000; font-weight:bold; font-size:14px; font-family:\'Times New Roman\', Times, serif;margin-top:0px;margin-bottom:7px;">票数:(.*)</div>”。

将这个正则表达式调用re.compile()函数编译,然后调用re.findall()函数即可得到符合该格式的列表。代码如下:

 def getVoteLists(html):
# 编译正则表达式模式
pattern = re.compile('<form action="vote_pass.asp" method="post" name="add">\r\n <div align="center" style="white-space:now=rap; overflow:hidden;width:200px;font-size:13px;margin-top:0px;margin-bottom:10px;">(.*)\r\n <label>\r\n <input type="hidden" name="id" value="(.*)"/>\r\n </label>\r\n </div>\r\n\t<div align="center" style="margin-top:0px;margin-bottom:10px;">NO(.*) 作者:(.*)</div>\r\n\t<div align="center" style="margin-top:0px;color:#990000; font-weight:bold; font-size:14px; font-family:\'Times New Roman\', Times, serif;margin-top:0px;margin-bottom:7px;">票数:(.*)</div>')
matchlist = re.findall(pattern, html) vlist = []
# 将用户ID和票数由str型转换成int型,由于findall()函数得到的列表元素是元组不可改,因此需要转换成可修改的列表
for item in matchlist:
itemlist = list(item)
itemlist[1] = int(itemlist[1])
itemlist[4] = int(itemlist[4])
vlist.append(itemlist)
# 根据票数进行排序
return sorted(vlist, key=lambda x:x[4], reverse=True)

使用re.findall()函数得到一个列表,列表中每个元素是一个元组,元组中包含标语、两个ID(一个HTML代码段中有两个ID变化)、作者、票数。我们将得到的结果根据票数进行排序。由于这些结果都是str类型,无法排序,需要将str转换成int类型,而元组中元素是不可改的,因此在函数中重新生成了个列表,将原列表中的元组改为列表,再对列表中的元素进行类型转换。转换完成后,调用sorted()函数根据票数进行排序。

最后,将结果输出前16项(随意定)。完整代码如下:

 #!/usr/bin/env python
# -*- coding: UTF-8 -*- import urllib2
import re # 获取页面数据
def getUrlRespHtml():
url = 'http://www.mudidi.net//toupiao/vote3.asp?id=2'
req = urllib2.Request(url)
resp = urllib2.urlopen(req)
respHtml = resp.read()
# 由于存在汉字,将页面转码成utf-8
respHtml = respHtml.decode('gbk').encode('utf-8')
return respHtml def getVoteLists(html):
# 编译正则表达式模式
pattern = re.compile('<form action="vote_pass.asp" method="post" name="add">\r\n <div align="center" style="white-space:now=rap; overflow:hidden;width:200px;font-size:13px;margin-top:0px;margin-bottom:10px;">(.*)\r\n <label>\r\n <input type="hidden" name="id" value="(.*)"/>\r\n </label>\r\n </div>\r\n\t<div align="center" style="margin-top:0px;margin-bottom:10px;">NO(.*) 作者:(.*)</div>\r\n\t<div align="center" style="margin-top:0px;color:#990000; font-weight:bold; font-size:14px; font-family:\'Times New Roman\', Times, serif;margin-top:0px;margin-bottom:7px;">票数:(.*)</div>')
matchlist = re.findall(pattern, html) vlist = []
# 将用户ID和票数由str型转换成int型,由于findall()函数得到的列表元素是元组不可改,因此需要转换成可修改的列表
for item in matchlist:
itemlist = list(item)
itemlist[1] = int(itemlist[1])
itemlist[4] = int(itemlist[4])
vlist.append(itemlist)
# 根据票数进行排序
return sorted(vlist, key=lambda x:x[4], reverse=True) def main():
print 'loading...'
html = getUrlRespHtml()
mList = getVoteLists(html) # 显示前16位
print 'Rank\tID\tVoteNums\tAuthor\t\tContent'
print '-' * 60
for i in range(16):
print '%d\t%d\t%d\t\t%s\t\t%s' % (i+1, mList[i][1], mList[i][4], mList[i][3], mList[i][0]) if __name__ == '__main__':
main()

这是对前一段时间学习Python的一个巩固练习。有什么更好更高效的方法欢迎留言讨论。

Python 网页投票信息抓取的更多相关文章

  1. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  2. 网页信息抓取 Jsoup的不足之处 httpunit

    今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取,相信Jsoup基本是首选的工具,完全的类JQuery操作,让人感觉很舒服.但是,今天我们就要说一说Jsoup的不足. 1.首先我们新 ...

  3. Ajax异步信息抓取方式

    淘女郎模特信息抓取教程 源码地址: cnsimo/mmtao 网址:https://0x9.me/xrh6z   判断一个页面是不是Ajax加载的方法: 查看网页源代码,查找网页中加载的数据信息,如果 ...

  4. 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)

    转自原文 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp) 最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决 ...

  5. c# 正则表达式对网页进行内容抓取

    原文 c# 正则表达式对网页进行内容抓取 搜索引擎中一个比较重要的环节就是从网页中抽取出有效内容.简单来说,就是吧HTML文本中的HTML标记去掉,留下我们用IE等浏览器打开HTML文档看到的部分(我 ...

  6. Atitit.web的自动化操作与信息抓取 attilax总结

    Atitit.web的自动化操作与信息抓取 attilax总结 1. Web操作自动化工具,可以简单的划分为2大派系: 1.录制回放 2.手工编写0 U' z; D! s2 d/ Q! ^1 2. 常 ...

  7. python&amp;php数据抓取、爬虫分析与中介,有网址案例

    近期在做一个网络爬虫程序.后台使用python不定时去抓取数据.前台使用php进行展示 站点是:http://se.dianfenxiang.com

  8. 接口测试——fiddler对soapui请求返回信息抓取

    原文:接口测试——fiddler对soapui请求返回信息抓取 背景:接口测试的时候,需要对接口的请求和返回信息进行查阅或者修改请求信息,可利用fiddler抓包工具对soapui的请求数据进行抓取或 ...

  9. python 页面信息抓取

    1. 特点 在python 解析html这篇文章中已经做了初步的介绍,接下来再坐进一步的说明.python抓取页面信息有下面两个特点: 依赖于HTML的架构. 微小的变化可能会导致抓取失败,这取决于你 ...

随机推荐

  1. 用imageNamed加载图片产生的问题

    通常我们会用imageNamed:来加载图片,但是用这个API有个问题,就是它会缓存加载的image. 因此,对于那些被重用的图片,这个API很高效.但是对于那些使用很少的图片,用这个就很耗内存,那怎 ...

  2. MySQL常用命令(待更新)

    1.登录到mysql:mysql -hlocalhost -uroot -p2.创建数据库:create database:3.使用数据库:use database:4.创建表:人员:qacreate ...

  3. 【caffe-windows】 caffe-master 之Matlab中model的分类应用

    此篇讲述在matlab中,如何将训练好的model用于图像分类.将以mnist为例,主要用到caffe-master\matlab\demo 下的classification_demo.m ,可参考我 ...

  4. (转载)MonoBehaviour的事件和具体功能总结

    分享一点MonoBehaviour的事件和具体功能总结的基础知识,苦于Visual Studio 2013没有对MonoBehaviour的行为做出智能提示,写个函数都要全手打,记性好的将就着手打,脑 ...

  5. nginx+lua+redis初体验

    1.下载nginx.lua.redis nginx下载地址 wget  http://nginx.org/download/nginx-1.8.0.tar.gz lua下载地址 wget http:/ ...

  6. aspxgridView,Repeater增加自动序号列

    第一种方式,直接在Aspx页面GridView模板列中.这种的缺点是到第二页分页时又重新开始了. <asp:TemplateField HeaderText="序号" Ins ...

  7. 在Apache下发布ASP.NET程序

    为什么要在apache下发布ASP.NET,看这篇文章您一定有自己的原因. 我是因为XP系统里面同时装IIS 和 AppServer会有问题. 步骤: 1.环境搭建,这个不废话,我安装的是.NET2. ...

  8. .NET 中的DateTime

    DateTime简介 DateTime是.NET中的时间类型,可以通过DateTime完成诸如获取当前的系统时间等操作.DateTime在.NET中是一个结构体,而并不是一个类. 如上图所示,这个图标 ...

  9. Ubuntu系统下安装python2.7

    第一步:下载python2.7相关版本源码(例如:Python-2.7.4.tgz) 第二步:安装 1) 解压 $tar zxvf Python-2.7.4.tar.tgz 2)进入文件夹: $cd ...

  10. nginx url重写 rewrite实例

    本文介绍下,在nginx中实现Url重写,学习rewrite的具体用法,有需要的朋友参考下吧. 原文地址:http://www.360doc.com/content/14/0202/20/142341 ...