# 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>

它可以匹配到目标代码,编写遇到主要的困难在于提取,有两点很关键:

  1. 小括号表示要提取的内容,所以我们把[\d\s]{6,}括起来
  2. 但是有些小括号只表示整体,并非要提取的内容,这个时候就要在相应的表达式前面加上"?:",表示不提取这个括号中的内容

关于正则表达式中的括号,我们可以简单总结一下:

  • 小括号:代表一个整体,例如(abc),它仅匹配字符串“abc”
  • 中括号:表示取其中之一,例如[abc],它匹配“a”、“b”、“c”
  • 大括号:表示重复次数,例如\d{1,3},它匹配一位到三位的数字

使用urllib进行网页爬取的更多相关文章

  1. 爬虫系列(六) 用urllib和re爬取百度贴吧

    这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...

  2. WebFetch 是无依赖极简网页爬取组件

    WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api ...

  3. 动态网页爬取例子(WebCollector+selenium+phantomjs)

    目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...

  4. Python和BeautifulSoup进行网页爬取

    在大数据.人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一.而Python则是目前数据科学项目中最常用的编程语言之一.使用Python与Beaut ...

  5. Node.js 动态网页爬取 PhantomJS 使用入门(转)

    Node.js 动态网页爬取 PhantomJS 使用入门 原创NeverSettle101 发布于2017-03-24 09:34:45 阅读数 8309  收藏 展开 版权声明:本文为 winte ...

  6. 12月4日学习爬虫007.使用Urllib模块进行简单网页爬取

    笔记如下: 1.https是http加强版协议(安全协议)http(普通网络通信协议) 爬数据 如果爬https发现和理想中的数据不同,可以改为http 直接去掉s即可 2.使用Urllib爬取简单网 ...

  7. python利用urllib实现的爬取京东网站商品图片的爬虫

    本例程使用urlib实现的,基于python2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -* ...

  8. 爬虫入门(三)——动态网页爬取:爬取pexel上的图片

    Pexel上有大量精美的图片,没事总想看看有什么好看的自己保存到电脑里可能会很有用 但是一个一个保存当然太麻烦了 所以不如我们写个爬虫吧(๑•̀ㅂ•́)و✧ 一开始学习爬虫的时候希望爬取pexel上的 ...

  9. python学习(三)--跟着例子写的贴吧网页爬取

    from urllib import requestimport urllib #爬贴吧网页文件到本地.首先在本地打开百度贴吧 搜索 java吧#第一页的内容是:http://tieba.baidu. ...

随机推荐

  1. HDU 4614-Vases and Flowers(线段树区间更新)

    题意: n个花瓶(0-n-1) 现有两个操作, 操作1 给a,f 从a位置开始向后连续插f个花(一个花瓶插一个)若当前花瓶有花则向后找,直到n-1位置如果还有多余的花则丢掉求查完花的第一和最后一个位置 ...

  2. SDUT 3258 Square Number 简单数学

    和上一题一样,把平方因子除去,然后对应的数就变成固定的 #include <cstdio> #include <iostream> #include <algorithm ...

  3. 卡尔曼滤波器【Kalman Filter For Dummies】

    搬砖到此: A Quick Insight     As I mentioned earlier, it's nearly impossible to grasp the full meaning o ...

  4. jdk源码调试功能

    JDK源码重新编译——支持eclipse调试JDK源码--转载 最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt. ...

  5. bzoj 1038 [ZJOI2008]瞭望塔(半平面交)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...

  6. Hadoop概念学习系列之谈谈RPC(三十三)

    RPC-------->远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...

  7. 集合框架-Map练习-记录字母出现的次数

    /* * 练习: * 字符串"abcb453   sddbs343bsjvAJBBDVBs21768723",获取该字符串中,每一个字母出现的次数. * 要求打印结果是:a(2)b ...

  8. Delphi 调用netsh命令修改IP地址

    Delphi 调用netsh命令修改IP地址 先介绍一下Netsh命令的使用方法: 在这里跟大家介绍几个简单的指令 1.Show IP 1.1Cmd Mode 直接在cmd下面输入 netsh int ...

  9. DTD - XML Building Blocks

    The main building blocks of both XML and HTML documents are elements. The Building Blocks of XML Doc ...

  10. ALM11 OTA API接口的问题

    ALM11 在安装的时候好像不会自动加载OTA接口. 正常情况下, OTA的接口文件的路径为: C:\Program Files\Common Files\Mercury Interactive\Qu ...