使用urllib进行网页爬取
# coding=gbk
# 抓取开奖号码
# url:http://datachart.500.com/dlt/zoushi/jbzs_foreback.shtml
'''
对网页逐行迭代,找到目标行时在往下读一行,两行提取一期开奖号码
'''
import re
from urllib import urlopen # winnumbers = {} # 期数:中奖号码
f = open('中奖号码.txt','w')
webpage = urlopen('http://datachart.500.com/dlt/zoushi/inc/jbzs_foreback.php') for line in webpage:
if re.search(r'^<td align="center">[\d\s]*</td>$',line.strip()):
index = line.split('>')[1].split()[0]
nextline = webpage.readline()
numbers = re.findall(r'<td class="chartBall0[1,2]">([\d]+)',nextline)
# winnumbers[index] = numbers
print index,numbers
f.write(index)
for i in range(len(numbers)):
f.write('\t')
f.write(numbers[i])
f.write('\n')
f.close()
结果如下:

首先用Chrome打开网页,利用审查元素功能找到真正的数据来源 http://datachart.500.com/dlt/zoushi/inc/jbzs_foreback.php
然后逐行迭代网页内容,利用正则表达式'<td align="center">[\d\s]*</td>'定位开奖期号:

然后使用 numbers = re.findall(r'<td class="chartBall0[1,2]">[\d]+',nextline) 找到开奖号码,对字符串处理一下得到开奖号码,存入列表。
这个时候 打印出来、存入字典、存入文件都可以。
这个方法不太好,可以直接把整个网页弄下来在本地处理。那样的话,写的正则就要复杂一点。鄙人刚刚学习正则,正在尝试中。
###################### 10月21日的分割线 ######################
按照上次最后提供的思路,把整个网页提取下来进行正则分析,代码如下
# coding=gbk
# 抓取开奖号码
# url:http://datachart.500.com/dlt/zoushi/jbzs_foreback.shtml
'''
把整个网页爬取下来,然后使用re.findall定位目标数据
'''
import re
from urllib import urlopen # winnumbers = {} # 期数:中奖号码
webpage = urlopen('http://datachart.500.com/dlt/zoushi/inc/jbzs_foreback.php')
text = webpage.read()
pattern = re.compile(r'<tr>\s*<td align="center">([\d\s]{6,})</td>\s*((?:<td class="(?:yl01|yl02|chartBall01|chartBall02)">\d+</td>){47})\s+</tr>')
local = re.findall(pattern,text)
for item in local:
numbers = re.findall(r'<td class="chartBall0[1,2]">([\d]+)</td>',item[1])
print item[0].strip(), numbers
# winnumbers[item[0]] = numbers
重点在于正则表达式的编写,我们需要一个正则表达式能够定位所有形如上图结构的html代码段。
最后测试得到了这样一段正则:
<tr>\s*<td align="center">([\d\s]{6,})</td>\s*((?:<td class="(?:yl01|yl02|chartBall01|chartBall02)">\d+</td>){47})\s+</tr>
它可以匹配到目标代码,编写遇到主要的困难在于提取,有两点很关键:
- 小括号表示要提取的内容,所以我们把[\d\s]{6,}括起来
- 但是有些小括号只表示整体,并非要提取的内容,这个时候就要在相应的表达式前面加上"?:",表示不提取这个括号中的内容
关于正则表达式中的括号,我们可以简单总结一下:
- 小括号:代表一个整体,例如(abc),它仅匹配字符串“abc”
- 中括号:表示取其中之一,例如[abc],它匹配“a”、“b”、“c”
- 大括号:表示重复次数,例如\d{1,3},它匹配一位到三位的数字
使用urllib进行网页爬取的更多相关文章
- 爬虫系列(六) 用urllib和re爬取百度贴吧
这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...
- WebFetch 是无依赖极简网页爬取组件
WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api ...
- 动态网页爬取例子(WebCollector+selenium+phantomjs)
目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...
- Python和BeautifulSoup进行网页爬取
在大数据.人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一.而Python则是目前数据科学项目中最常用的编程语言之一.使用Python与Beaut ...
- Node.js 动态网页爬取 PhantomJS 使用入门(转)
Node.js 动态网页爬取 PhantomJS 使用入门 原创NeverSettle101 发布于2017-03-24 09:34:45 阅读数 8309 收藏 展开 版权声明:本文为 winte ...
- 12月4日学习爬虫007.使用Urllib模块进行简单网页爬取
笔记如下: 1.https是http加强版协议(安全协议)http(普通网络通信协议) 爬数据 如果爬https发现和理想中的数据不同,可以改为http 直接去掉s即可 2.使用Urllib爬取简单网 ...
- python利用urllib实现的爬取京东网站商品图片的爬虫
本例程使用urlib实现的,基于python2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -* ...
- 爬虫入门(三)——动态网页爬取:爬取pexel上的图片
Pexel上有大量精美的图片,没事总想看看有什么好看的自己保存到电脑里可能会很有用 但是一个一个保存当然太麻烦了 所以不如我们写个爬虫吧(๑•̀ㅂ•́)و✧ 一开始学习爬虫的时候希望爬取pexel上的 ...
- python学习(三)--跟着例子写的贴吧网页爬取
from urllib import requestimport urllib #爬贴吧网页文件到本地.首先在本地打开百度贴吧 搜索 java吧#第一页的内容是:http://tieba.baidu. ...
随机推荐
- SQL竖表转横表 / 横表转竖表
竖表转横表 竖表结构: Name Course Grade 张三 语文 75 张三 数学 80 张三 英语 90 李四 语文 95 李四 数学 55 转换后横表结构: Name 语文 数学 英语 张三 ...
- MMU(what,how,todo)
出处:http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=11580&fromuid=5490 正文黑色,代码蓝色,重点标红. ...
- 【原创】lua编译时发现缺少readline库
编译lualua项目,其中用到了lua-5.1版本的源码,编译时提示缺少readline库,找不到readline/readline.h头文件等 发现系统中其实有安装readline库不过没有做链接和 ...
- MATLAB将批量的图片保存为mat文件
clc; clear all; num = 10; for i = 1 : num IM = imread(sprintf('E:\\TEST\\PtzTEST2015-8-9\\image1280x ...
- Android中使用sqlite笔记
1.实现SQLiteHelper来在android中使用SQLite.代码如下,来自android官网. public class FeedReaderDbHelper extends SQLiteO ...
- hdoj 1859 最小长方形
最小长方形 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [iOS基础控件 - 4.6] iOS开发中的长度单位
对于开发中设置的位置.尺寸单位 系统会根据屏幕的性质转换为像素单位 由于视网膜屏在同样尺寸下分辨率是非视网膜屏的两倍,所以 非视网膜屏:1个单位 = 1像素 视网膜屏:1个单位 = 2像素 应对非 ...
- HDU 4628
这是一个大水题啊... 因为比赛时不会算复杂度耽误半天. i从0到2^n枚举集合i的所有分割两半的情况的复杂度为O(3^n),可以想象这个过程相当于是给每个位标记0,1,2(0表示不选,1,2表示两个 ...
- SVG 矢量图形格式
SVG(Scalable Vector Graphics)是基于 XML 的一种矢量图形格式,它即可以作为单独的图形文件使用也可以嵌入到网页中并由 JavaScript 来操作,非常方便和灵活.SVG ...
- 【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一.菜单项(CCMenuItem) 菜单项 ...