python+requests+mysql 爬取官网双色球开奖数据
分析网页数据获取方式
第一种查询方式
在官网上 可以找到多种数据查询方式,第一种是按期号查询数据 指定code去查询该期数据
查询链接如下:
Request URL: http://www.cwl.gov.cn/cwl_admin/kjxx/findKjxx/forIssue?name=ssq&code=2018126
第二种查询方式
在这里 有其他的批量查询数据的方式 其中自定义查询中选用按期号查询的方式较为方便
这种查询方式可以指定例如 从 2013001期到2013101期 甚至从 2013001-2015001都可以查 但是如果时间跨度较大的话 回传的数据会分页
链接如下
Request URL: http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=&issueStart=2013001&issueEnd=2015001&dayStart=&dayEnd=&pageNo=
有些参数可以为空 这里可以精简一下
Url: http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueStart=2018001&issueEnd=2018051
注意:链接直接点过去的话是看不到任何东西的,服务端应该设置了某种 Referrer Policy
这个坑困扰了我有一阵 刚入坑python爬虫就遇到这种棘手的问题
我并没有从豆瓣爬虫开始练起 而是找了一个需要的数据的链接开始爬
虽然会遇到更多的坑 但与此同时 在解决这些问题的过程中 也能学到更多的东西
这个问题经过反复对比请求头 终于发现了问题:
请求头中不带referrer信息的话 是拿不到任何数据的
这里可以对比两次请求的请求头来看
图1 是成功拿到数据的请求头
图2 无任何数据返回
先简单拿到部分数据看一下
url= 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueStart=2018001&issueEnd=2018003'
res = requests.get(url)
print(res.text)
这样写的话 对于某些 链接是有效的 开始什么数据都拿不到 确实很让人迷惑
先开始想 是不是没有加user-agent???
空想无用 尝试验证一下 这里在请求头中 加上user-angent试试
代码如下
url= 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueStart=2018001&issueEnd=2018003'
headers = {
'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 70.0.3538.77 Safari / 537.36'
}
res = requests.get(url, headers=headers)
print(res.text)
还是拿不到 数据 那就不只是user-angent的问题了
就像上面说的 通过反复对比请求头 最后终于解决了问题
url= 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueStart=2018001&issueEnd=2018003'
headers = {
'Referer': 'http://www.cwl.gov.cn/kjxx/ssq/kjgg/',
}
res = requests.get(url, headers=headers)
print(res.text)
再次尝试 ,结果不需要加user-angent 也可以,最终正常拿到数据的代码如上
现在可以简单拿到回传的数据了
为了好分析 这里先拿两期数据下来分析一下
拿到的数据如下:
{
'state': 0,
'message': '查询成功',
'pageCount': 1,
'countNum': 2,
'Tflag': 1,
'result': [{
'name': '双色球',
'code': '2014004',
'detailsLink': '/c/2014-01-09/384956.shtml',
'videoLink': '',
'date': '2014-01-09(四)',
'week': '四',
'red': '01,04,19,22,24,25',
'blue': '15',
'blue2': '',
'sales': '373155800',
'poolmoney': '201488460',
'content': '北京1注,安徽1注,山东2注,广东1注,共5注。',
'addmoney': '',
'addmoney2': '',
'msg': '',
'z2add': '',
'm2add': '',
'prizegrades': [{
'type': 1,
'typenum': '5',
'typemoney': '9580091'
}, {