【Python】爬虫初体验,40行代码爬取双色球2003年至今的开奖号码

爬虫爬取的双色球开奖号码

按我目前的理解,爬虫的工作原理大致是:

获取目标网页,在网页(html文件)中筛选目标数据,最后把数据导出

利用爬虫爬取数据看似很“高深莫测”,只需几分钟甚至几秒,就能获得非人力操作可比拟的庞大数据

实际上爬虫的原理(仅限我目前的了解)相当“蠢”,和“穷举法”破解密码一样简单粗暴

 

假设我们现在有一个任务——获取双色球所有的历史开奖号码并有序地录入excel中

那么我们需要做的工作有:

  1. 打开彩票网站(获取html文件)
  2. 找到第一期开奖结果(筛选数据)
  3. 录入excel(数据导出)
  4. 找到下一期的开奖结果(获取html文件+筛选数据)
  5. 重复操作3、4步直到录入了所有开奖结果

 

截至2020年4月25日,双色球一共有2538期

按照手动录入一期开奖号码到excel中耗时1分钟计算

2538÷60=42小时

那么手动录入2538期开奖号码需要你不吃不喝不眠不休连续工作42小时

这还是你保证工作效率不下降的理想状态

 

但如果用爬虫完成这个任务,只需15分钟

虽然爬虫只用15分钟就能完成需要我们连续工作42小时的工作量

但爬虫可没有偷工减料,前面所述的工作步骤,爬虫和我们一样,一步都不能少

只不过是由于计算机的运算速度非常快,从而缩短了整个工作周期

所以说,计算机智商为0(不具备自主思考能力),但却是个计算高手(运算速度快)

 

要获得双色球开奖号码

首先我们需要打开彩票网站,http://kaijiang.500.com/shtml/ssq/03001.shtml

相对于爬虫而言,就是获取这个页面(即html文件)

 

用request库,可以很方便地得到html文件

requests.get()函数返回一个response对象,传递参数url是目标网页地址

requests.get()函数后面加上“.text”,以便将response对象转换成字符串

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#爬取2003年2月23日至今的双色球开奖结果

import requests

def turn_page():
    url = "http://kaijiang.500.com/ssq.shtml"
    html = requests.get(url).text

 

 

在浏览器打开上述url,右击选择【查看源文件】

通过分析源文件,找到需要爬取的数据,制定合适的爬取方案

从图中可以看到,这个源文件包含了每一期的网页链接,并且所有链接都在一个类名为“iSelectList”的<div>标签中

这意味着我们能够一次就把所有链接保存到一个列表中,之后只需按照列表顺序逐个打开链接爬取数据就可以了

 

 

为了得到html源文件,可以使用BeautifulSoup

BeautifulSoup是一个可以从HTML或XML文件中提取数据的第三方库

BeautifulSoup()函数有两个参数,第一个参数是要解析的HTML/XML代码,第二个参数是解析器

在这里我们以前面requests.get()返回的html作为第一个参数,'html.parser'是Python内置的解析器(标准库)

 

解析html后,得到一个BeautifulSoup 的对象,即变量soup

BS支持大部分的CSS选择器,在BS对象的.select()方法传入字符串参数,即可使用CSS选择器的语法扎到tag(标签)

前面我们已经知道,开奖号码的页面链接在一个class为“iSelectList”的<div>标签中

而链接是用<a>标签标示的,所以我们在select()方法中传入的参数是“div.iSelectList a”

即,选择所有在class为“iSelectList”的<div>标签中的<a>标签

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#爬取2003年2月23日至今的双色球开奖结果

import requests
from bs4 import BeautifulSoup

def turn_page():
    url = "http://kaijiang.500.com/ssq.shtml"
    html = requests.get(url).text
    soup = BeautifulSoup(html,'html.parser')
    pageList = soup.select("div.iSelectList a")

 

现在我们已经得到包含所有结果链接的<a>标签并赋值给列表变量pageList

用一个for循环语句,遍历pageList中的每一个元素,p['href']用于提取链接,p.string用于提取标签中的字符串(即期数)

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#爬取2003年2月23日至今的双色球开奖结果

import requests
from bs4 import BeautifulSoup

def turn_page():
    url = "http://kaijiang.500.com/ssq.shtml"
    html = requests.get(url).text
    soup = BeautifulSoup(html,'html.parser')
    pageList = soup.select("div.iSelectList a")
    for p in pageList:
        url = p['href']       #提取链接
        page = p.string       #提取字符串
  

 

通过观察源文件,发现开奖号码由无序标签(ul li)定义,并且在一个class为“ball_box01”的<div>标签中

 

声明一个函数download(),形参url是要提取开奖号码的页面链接,page是开奖期数

变量html和soup和前面一样,在此不再赘述

用CSS选择器语法select('div.ball_box01 ul li')得到开奖号码所在的<li>标签,赋值给列表变量list

声明一个空的列表变量ball,for循环语句遍历list,提取每一个开奖号码(li.string)并添加到ball列表

def download(url,page):   
    html = requests.get(url).text
    soup = BeautifulSoup(html,'html.parser')
    list = soup.select('div.ball_box01 ul li')
    ball = []
    for li in list:
        ball.append(li.string)

 

声明一个函数write_to_excel(),形参page是开奖期数,ball是相应期数开奖号码

用Python的file方法把每一期的开奖号码写入csv表格文件中

为了避免出现乱码,打开csv文件时加上encoding="utf_8_sig"

def write_to_excel(page,ball):
    f = open('双色球开奖结果.csv','a',encoding='utf_8_sig')
    f.write(f'第{page}期,{ball[0]},{ball[1]},{ball[2]},{ball[3]},{ball[4]},{ball[5]},{ball[6]}\n')
    f.close()

 

声明函数main(),作为程序入口

如果exists()函数发现存在同名的csv文件,就会删除

在主函数main()调用turn_page()函数

def main():
    if(os.path.exists('双色球开奖结果.csv')):
        os.remove('双色球开奖结果.csv')
    turn_page()

 

 

程序完整代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#爬取2003年2月23日至今的双色球开奖号码

import requests
import os
from bs4 import BeautifulSoup

def download(url,page):   
    html = requests.get(url).text
    soup = BeautifulSoup(html,'html.parser')
    list = soup.select('div.ball_box01 ul li')
    ball = []
    for li in list:
        ball.append(li.string)
    write_to_excel(page,ball)
    print(f"第{page}期开奖结果录入完成")

def write_to_excel(page,ball):
    f = open('双色球开奖结果.csv','a',encoding='utf_8_sig')
    f.write(f'第{page}期,{ball[0]},{ball[1]},{ball[2]},{ball[3]},{ball[4]},{ball[5]},{ball[6]}\n')
    f.close()

def turn_page():
    url = "http://kaijiang.500.com/ssq.shtml"
    html = requests.get(url).text
    soup = BeautifulSoup(html,'html.parser')
    pageList = soup.select("div.iSelectList a")
    for p in pageList:
        url = p['href']
        page = p.string
        download(url,page)

def main():
    if(os.path.exists('双色球开奖结果.csv')):
        os.remove('双色球开奖结果.csv')
    turn_page()

if __name__ == '__main__':
    main()

 

 

 

  • 16
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cimoon_

一分也是爱,用钱砸我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值