在爬取一些简单的 (没有反爬机制的) 静态网页时, 一般采取的策略是: 选中目标(所谓的 url 链接), 观察结构(链接结构, 网页结构), 构思动手(选用什么 html 下载器, 解析器等).
前两天, 在网上看到一个有意思的问题: 彩票预测靠谱么? 为什么还有那么多的人相信彩票预测?
暂且不说, 彩票预测是否靠谱? 彩票预测也分人而异, 江湖上骗术很多, 有些甚至会误以为彩票预测的准确度可以很高, 这些操盘手法, 让不知原理的彩民心甘情愿地掏钱买料.
在彩票预测上, 也有正儿八经去研究 "规律" 的, 不外乎三个 "派别": 数据派, 图形派, 公式派. 还有一派不列入: 字谜字画派, 可纳入蛇精病行列.
究竟哪一派预测的靠谱准确呢? 不懂, 因为我几乎不买彩票(买也是玩玩, 娱乐娱乐), 也不去研究. 但不管哪一派总得有数据可研究, 今天我只负责帮大家如何获取 3D 彩票自创办以来, 所有的数据(中奖号码, 中奖注数, 销售额以及返奖比例等)
在爬取一些简单的 (没有反爬机制的) 静态网页时, 一般采取的策略是: 选中目标(所谓的 url 链接), 观察结构(链接结构, 网页结构), 构思动手(选用什么 HTML 下载器, 解析器等). 在爬虫过程中, 都会涉及到三种利器:
HTML 下载器: 下载 HTML 网页
HTML 解析器: 解析出有效数据
数据存储器: 将有效数据通过文件或者数据库的形式存储起来
今天, 我们将利用 requests 库和 BeautifulSoup 模块来抓取中彩网页福彩 3D 相关的信息, 并将其保存到 Excel 表格中.
在开始前, 先分析看看目标网页的结构:
可以发现, 目标网页的 URL http://kaijiang.zhcw.com/zhcw/html/3d/list_2.html, 每次变化一处: list_x 后面的数字, 其代表第几页.
然后, 观察其网页结构, 也很简单, 可以看到一期的彩票信息对应的源代码是一个 tr 节点, 我们可以用 BeautifulSoup 库来提取这里面的一些信息.
整体思路是: 若要获取福彩 3D 创办 14 年以来所有的信息(一共 246 页), 只需要分开请求 246 次, 这样获取不同的页面之后, 再利用 BeautifulSoup 库提取到相关信息, 利用 xlrd 库将数据写入 Excel 中, 就可以获取到福彩 3D 所有的信息, 结果如下图:
(一共将近 5000 条数据)
详情代码如下:
- import requests
- from bs4 import BeautifulSoup
- import xlwt
- import time
- # 获取第一页的内容
- def get_one_page(url):
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ApplewebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
- }
- response = requests.get(url,headers=headers)
- if response.status_code == 200:
- return response.text
- return None
- # 解析第一页内容, 数据结构化
- def parse_one_page(html):
- soup = BeautifulSoup(html,'lxml')
- i = 0
- for item in soup.select('tr')[2:-1]:
- yield{
- 'time':item.select('td')[i].text,
- 'issue':item.select('td')[i+1].text,
- 'digits':item.select('td em')[0].text,
- 'ten_digits':item.select('td em')[1].text,
- 'hundred_digits':item.select('td em')[2].text,
- 'single_selection':item.select('td')[i+3].text,
- 'group_selection_3':item.select('td')[i+4].text,
- 'group_selection_6':item.select('td')[i+5].text,
- 'sales':item.select('td')[i+6].text,
- 'return_rates':item.select('td')[i+7].text
- }
- # 将数据写入 Excel 表格中
- def write_to_excel():
- f = xlwt.Workbook()
- sheet1 = f.add_sheet('3D',cell_overwrite_ok=True)
- row0 = ["开奖日期","期号","个位数","十位数","百位数","单数","组选 3","组选 6","销售额","返奖比例"]
- #写入第一行
- for j in range(0,len(row0)):
- sheet1.write(0,j,row0[j])
- #依次爬取每一页内容的每一期信息, 并将其依次写入 Excel
- i=0
- for k in range(1,247):
- url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list_%s.html' %(str(k))
- html = get_one_page(url)
- print('正在保存第 %d 页.'%k)
- #写入每一期的信息
- for item in parse_one_page(html):
- sheet1.write(i+1,0,item['time'])
- sheet1.write(i+1,1,item['issue'])
- sheet1.write(i+1,2,item['digits'])
- sheet1.write(i+1,3,item['ten_digits'])
- sheet1.write(i+1,4,item['hundred_digits'])
- sheet1.write(i+1,5,item['single_selection'])
- sheet1.write(i+1,6,item['group_selection_3'])
- sheet1.write(i+1,7,item['group_selection_6'])
- sheet1.write(i+1,8,item['sales'])
- sheet1.write(i+1,9,item['return_rates'])
- i+=1
- f.save('3D.xls')
- def main():
- write_to_excel()
- if __name__ == '__main__':
- main()
到此, 关于 14 年的福彩 3D 信息都可以爬取下来, 至于如何预测? 下一期的彩票趋势如何? 不懂也不会, 接下来是否中奖, 就靠你们了. 彩民们, 我只能帮你们到这了!
最后结尾, 关于彩票预测究竟准不准? 我不说太多的理论分析, 我只提出两个问题:
命题 1: 以双色球为例, 下一期双色球号码, 1,2,3,4,5,6,7 和 3,4,8,11,22,29,7 这两组号码的中奖概率如何? 谁高谁低还是都一样?
命题 2: 第二个问题更简单. 假设你已经投了 9 次硬币, 结果都是正面. 现在你要投第 10 次, 请问是正面的概率是多少?
如果你还要问我, 彩票有规律可循吗? 在我看来, 彩票规律就是没有规律(不信, 你去分析分析 14 年以来的所有数据), 以人类的计算水平, 即使有的话也计算不出来的. 彩票是娱乐, 是一个运气的游戏, 一个人即使在彩票上赚到了钱, 运气好, 也不代表使用的方法就可以提高彩票中奖率. 任何打着提高中奖率的期号进行的盈利行为, 即使出发点是善意的, 也会最终走向错误.
来源: http://developer.51cto.com/art/201807/578364.htm