目标是对所有双色球的号码进行爬取
在工作开始前我们需要先去网站蹲点
这个是页面:http://www.cwl.gov.cn/kjxx/ssq/hmhz/
页面分析工具:Firebug
首先进行页面的分析
点击一下第二页,链接变成了这样
http://www.cwl.gov.cn/kjxx/ssq/hmhz/index_1.shtml
再回到第一页,链接变成了这样
http://www.cwl.gov.cn/kjxx/ssq/hmhz/index.shtml
再去第三页,变成了这样
http://www.cwl.gov.cn/kjxx/ssq/hmhz/index_3.shtml
观察一下除了第一页之外其他页面的索引可以用index_+num来实现
得出代码:
def get_link(pages = 10): #定义页面的生成器
for i in xrange(pages):
url = 'http://www.cwl.gov.cn/kjxx/ssq/hmhz/'
if i == 0:
url = url + 'index.shtml'
else:
url = url + 'index_' + str(i) + '.shtml'
yield url
取出页面:
for url in get_link(page):
ul = url
测试效果:(打印默认状况)
接下来使用firebug对页面进行分析:
审查元素找到所需爬取信息
对元素信息进行定位:
这里使用的是re对页面元素进行定位:
cmpdate = re.compile('(\d+?) ') #日期
cmpblue = re.compile('(\d\d)') #蓝球
cmpred = re.compile('(\d\d)') #红球
后来看一下这样的写法比较基础虽然可以提取数据但是后处理似乎比较麻烦
整合一下
def getlottery(pages = 10):
hd = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'}
date = []
redball = []
blueball = []
cmpdate = re.compile('(\d+?) ')
cmpblue = re.compile('(\d\d)')
cmpred = re.compile('(\d\d)')
for url in get_link(pages):
try:
html = requests.get(url, headers = hd)
html.raise_for_status()
html.encoding = html.apparent_encoding
res = html.text
except:
pass
D = re.findall(cmpdate, res)
B = re.findall(cmpblue, res)
R = re.findall(cmpred, res)
date.append(D)
blueball.append(B)
redball.append(R)
return date, redball, blueball
测试运行:
爬取第一页的信息
不过看着第二个杂乱的列表,还是想说,后处理真的好麻烦QAQ
后续工作,可能还是需要想一下怎么样去写一个好的正则表达式才能让输出列表的可读性更强吧
补:(后处理)qwq:
def washdata(date, redball, blueball):
tmp = []
D = []
B = []
R = []
for i in xrange(len(date)):
for j in xrange(len(date[i])):
D.append(date[i][j])
B.append(blueball[i][j])
for j in xrange(len(redball[i])):
tmp.append(redball[i][j])
m = 0
while m != len(tmp):
R.append(tmp[m:m+6])
m += 6
return D, R, B
def writefile(date, redball, blueball):
with open('Lottery.csv', 'wb') as csvFile:
writer = csv.writer(csvFile)
fileheader = ['Date', 'RedBall#0', 'RedBall#1', 'RedBall#2', 'RedBall#3', \
'RedBall#4', 'RedBall#5','BlueBall']
writer.writerow(fileheader)
for i in xrange(len(date)):
writer.writerow([date[i], redball[i][0], redball[i][1], \
redball[i][2], redball[i][3], redball[i][4], redball[i][5], \
blueball[i]])
处理效果:
起码能看了qwq
总结一下:
那个时候会xpath就好了 哈哈哈哈哈哈哈