【Python】爬虫初体验,40行代码爬取双色球2003年至今的开奖号码
按我目前的理解,爬虫的工作原理大致是:
获取目标网页,在网页(html文件)中筛选目标数据,最后把数据导出
利用爬虫爬取数据看似很“高深莫测”,只需几分钟甚至几秒,就能获得非人力操作可比拟的庞大数据
实际上爬虫的原理(仅限我目前的了解)相当“蠢”,和“穷举法”破解密码一样简单粗暴
假设我们现在有一个任务——获取双色球所有的历史开奖号码并有序地录入excel中
那么我们需要做的工作有:
- 打开彩票网站(获取html文件)
- 找到第一期开奖结果(筛选数据)
- 录入excel(数据导出)
- 找到下一期的开奖结果(获取html文件+筛选数据)
- 重复操作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 requestsdef 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 BeautifulSoupdef turn_page():url = "http://kaijiang.500.com/ssq.shtml"html = requests.get(url).textsoup = 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 BeautifulSoupdef turn_page():url = "http://kaijiang.500.com/ssq.shtml"html = requests.get(url).textsoup = 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).textsoup = 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 BeautifulSoupdef download(url,page): html = requests.get(url).textsoup = 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).textsoup = BeautifulSoup(html,'html.parser')pageList = soup.select("div.iSelectList a")for p in pageList:url = p['href']page = p.stringdownload(url,page)def main():if(os.path.exists('双色球开奖结果.csv')):os.remove('双色球开奖结果.csv')turn_page()if __name__ == '__main__':main()
【Python】爬虫初体验,40行代码爬取双色球2003年至今的开奖号码相关推荐
- python游戏辅助lol_Python爬虫实战,60行代码爬取英雄联盟全英雄全皮肤,找寻曾今那些被删除的绝版皮肤...
学了一周多的爬虫课后终于按捺不住了,小编决定自己手动编写爬虫程序,刚好LJ在鼓励学员分享成果,优秀作品有奖励,就把自己用Python编程爬取各大游戏高清壁纸的过程整理了出来进行投稿,与大家一起分享. ...
- Python爬虫利用18行代码爬取虎牙上百张小姐姐图片
Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...
- 教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!!
教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!! 代码展示: 开发环境: windows10 python3.6 开发工具: pycharm weddriver 库: sel ...
- python pyquery不规则数据的抓取_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...
- python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息
实战项目 1:5 行代码爬取国内所有上市公司信息 Python入门爬虫与数据分析 在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例.兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力 ...
- pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...
- python:利用20行代码爬取网络小说
文章目录 前言 一.爬虫是什么? 二.实现过程 总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 今天,来给大家一个分享一下如何使用20爬虫行代码爬取网络小说(这里我们以龙 ...
- python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...
- Python爬虫《自动化学报》数据爬取与数据分析
Python爬虫<自动化学报>数据爬取与数据分析 文章目录 Python爬虫<自动化学报>数据爬取与数据分析 前言 一.代码 二.结果展示 三.爬虫实现 1.准备 2.获取网页 ...
最新文章
- 5G NR — 毫米波
- 3、Eternal框架-控制器
- 红米ac2100breed看模块_骁龙865加持,红米K30S至尊纪念版11日再开售
- 801. Minimum Swaps To Make Sequences Increasing
- 【C语言基础】C语言异常捕获机制 - setjmp
- 解决Driver/library version mismatch
- 【ElasticSearch】 ElasticSearch 读取 流程
- PB数据窗口自动换下一页
- 10.11 cocoapods安装
- OBS Studio录制腾讯会议
- sampro效果_SAM机架设置音乐/话筒/麦克风/输入和效果输出/添加VST插件/详细教程(附:SAM机架VST插件效果包下载)...
- PCA降维算法总结以及matlab实现PCA
- 斐讯k2路由器刷第三方固件
- 王者荣耀背景故事整合
- java der格式_读取DER格式java中的私钥
- 仿微信朋友圈图片上传
- 地网导通测试仪_江西地网接地导通测试仪特点
- 衣服挂牌 挂牌吊牌(麻绳,五彩绳,尼龙绳等)
- 中国一百大姓,您排第几?
- 静态网页制作HTML学习笔记
热门文章
- mysql以秒为单位限制资源,【转载】 MySQL之用户资源限制
- python3 value counts函数_pandas计数函数 :value_counts( )和counts( )的使用
- 【RDMA】技术详解(一):RDMA概述
- 如何比较字符串大小(超详细)
- 安卓APP丨微信小程序的美容预约系统
- 安装element iu环境
- MySQL从外部导入数据库教程
- linux 内核 strftime,linux 下时间函数strftime()的用法
- 伯努利分布、二项分布、多项分布、Beta分布、Dirichlet分布
- 东师计算机教育综合,2021年东北师范大学学前教育专硕考研必看成功上岸前辈复习经验谈...