Python网络爬虫和信息提取:(动态网站)双色球数据爬取及写入数据库Sqlite、json和Excel表

我想着拿什么练习下网络爬虫信息提取时,就想到了双色球,心想把往期数据提取出来也是个不错的主意,把数据保存下来以后做数据分析,根据分析结果去买双色球岂不是美哉?!哈哈哈。。
当然这里仅是爬取和保存,数据分析就是后话了。
既然有了想法就准备开始吧。我准备提取中国福彩网的官网上双色球的往期数据,首先我们打开官网"http://www.cwl.gov.cn/"然后确认robots协议,是可以对网站进行爬取的(善意提醒:不要频繁爬取),那么就开始吧。
我们打开双色球往期开奖网页,查看源代码,发现并没有我们想要的数据,也就是这个是个动态网页,我们需要打开F12开发者工具,对我们需要的网页进行抓包。如下图所示,首先进到Network,然后点击XHR,在左边name栏查看哪个是我们所需要的,可以通过preview来确认。

在这里插入图片描述

在这里插入图片描述
我们确认了想要的数据后,那么这个url:”http://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&issueCount=30 “就是我们所需要的,打开网页内容如下:在这里插入图片描述
正是我们要的数据,而且是个超级简单的组成,但是在开始爬之前我们呢观察下网址,后面是Count=30这样组成的,那么很显然这是确定我们要爬取多少期的,所以我们可以手动输入想要的期数(注意最大提供100期的),如下所示:

cnt = input("请输入你要获取的数量(0-100]的整数:")
cntINT = int(cnt)
url = 'http://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&issueCount='+cnttry:if(0<cntINT<=100):r = requests.get(url, timeout=30)r.raise_for_status()encoding = chardet.detect(r.content)['encoding']r.encoding = encodingdemo = r.textelse:print("请输入(0-100]的数")
except:print("获取数据失败")

这里想说明下encoding = chardet.detect(r.content)[‘encoding’],
因为这个apparent_encoding方法还是有几率会出现乱码,所以这里引用了chardet库来检测文本编码,还有个库为cChardet,看名字就知道这俩库是兄弟,具体啥区别不清楚,好像cChardet更快一点。但是我用的是python3.10,目前这个库还未有匹配版本,所以先用了chardet库。

然后通过BeautifulSoup获取标签内容:

soup = BeautifulSoup(demo, "html.parser")   

我们需要将获取的内容转为字典:

my_dict = []
my_dict02 = []
for s in soup:my_dict.append(s)
for m in my_dict[0]:my_dict02.append(m)
# print(my_dict02)
Dict_str = "".join(my_dict02)
new_dict = json.loads(Dict_str)

到这里我们已经爬到我们要的内容了,但是注意的是,我们真正需要的内容是在字典 key result的值内,所以我们在把他提出来:

final_dict = new_dict.get('result')           

到这里我们真正的爬到了我们要的内容,现在开始分别写入json,Sqlite和Excel中,首先写道json中,

with open('Ssq_data'+cnt+'.json', 'w',encoding='utf-8') as json_file:json.dump(final_dict, json_file, indent=4, ensure_ascii=False)

indent=4, ensure_ascii=False 是将其格式化,json内的内容如下:
在这里插入图片描述
格式化后的json数据看起来很漂亮。

然后我们将其写入数据库Sqlite,这里我们可以直接通过final_dict字典写入也可以通过我们建立的json数据写入都可以,首先建立我们的数据库:

conn = sqlite3.connect('Ssqdata'+cnt+'.sqlite')
cur = conn.cursor()

然后建立表格,因为我个人想要的数据为期号,开奖日期,红球号,蓝球号,所以需要四个表格,但是我还想建立两个关于红球和蓝球的,看看他们是否会有重复出现,所以需要六个表格:

cur.executescript('''
DROP TABLE IF EXISTS Ssq;
DROP TABLE IF EXISTS RE;
DROP TABLE IF EXISTS DATE;
DROP TABLE IF EXISTS BL;
DROP TABLE IF EXISTS Red;
DROP TABLE IF EXISTS Blue;

我的Ssq表格里是以期号来建立的,期号不会有重复所以比较保险,然后同时也想插入日期,红球和蓝球到这个表格里做一个汇总表格所以我们要如下建立:

//汇总表
CREATE TABLE Ssq (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,code   TEXT UNIQUE,date   INTEGER,red    INTEGER,blue   INTEGER
);CREATE TABLE DATE (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,date   TEXT NOT NULL
);  CREATE TABLE RE (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,red   TEXT NOT NULL
);  
CREATE TABLE BL (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,blue   TEXT NOT NULL
);    
//看看是否会有重复的出现(显然几率和中头奖差不多)
CREATE TABLE Red (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,red    TEXT UNIQUE
);
//看看蓝球是不是有重复出现,因为是16内的单数所以大概率会出现重复的
CREATE TABLE Blue (  id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,blue   TEXT UNIQUE)
''')

表格建好了就要写入数据:

//读入刚刚建立的json数据
str_data = open('Ssq_data'+cnt+'.json',mode='r', encoding='utf-8')
json_data = json.load(str_data)for entry in json_data://也可以通过字典 final_dict 读入数据code = entry['code']date = entry['date']red = entry['red']blue = entry['blue']cur.execute('''INSERT OR IGNORE INTO Ssq (code,date,red,blue)VALUES ( ?,?,?,? )''', (code, date, red, blue))cur.execute('SELECT id FROM Ssq WHERE code = ? ', (code,))cur.execute('''INSERT OR IGNORE INTO DATE (date)VALUES ( ? )''', (date,))cur.execute('SELECT id FROM DATE WHERE date = ? ', (date,))cur.execute('''INSERT OR IGNORE INTO RE (red)VALUES ( ? )''', (red,))cur.execute('SELECT id FROM RE WHERE red = ? ', (red,))cur.execute('''INSERT OR IGNORE INTO Red (red)VALUES ( ? )''', (red,))cur.execute('SELECT id FROM Red WHERE red = ? ', (red,))cur.execute('''INSERT OR IGNORE INTO BL (blue)VALUES ( ? )''', (blue,))cur.execute('SELECT id FROM BL WHERE blue = ? ', (blue,))cur.execute('''INSERT OR IGNORE INTO Blue (blue)VALUES ( ? )''', (blue,))cur.execute('SELECT id FROM Blue WHERE blue = ? ', (blue,))conn.commit()

这样就保存到数据库中,我们用DB Browser打开Ssqdata(cnt).sqlite文件,可以看到结果如下:
在这里插入图片描述
在这里插入图片描述
最后我们写入excel表中:

book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('双色球')//建立sheet
//建立表头
sheet.write(0, 0, '期号')
sheet.write(0, 1, '开奖日期')
sheet.write(0, 2, '红球')
sheet.write(0, 3, '蓝球')
index =1
//写入数据
for entry in json_data:code = entry['code']date = entry['date']red = entry['red']blue = entry['blue']sheet.write(index, 0, code)sheet.write(index, 1, date)sheet.write(index, 2, red)sheet.write(index, 3, blue)index += 1
book.save(u"Ssq_data"+cnt+".xls")

结果如下:在这里插入图片描述
下面附上完整代码:

import  requests
from bs4 import BeautifulSoup
import json
import sqlite3
import chardet
import xlwtcnt = input("请输入你要获取的数量(30,50,100):")
cntINT = int(cnt)
url = 'http://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&issueCount='+cnttry:if(0<cntINT<=100):r = requests.get(url, timeout=30)r.raise_for_status()encoding = chardet.detect(r.content)['encoding']r.encoding = encodingdemo = r.textelse:print("请输入(0-100]的数")
except:print("获取数据失败")//获取内容并转为字典
soup = BeautifulSoup(demo, "html.parser")
my_dict = []
my_dict02 = []
for s in soup:my_dict.append(s)
for m in my_dict[0]:my_dict02.append(m)
# print(my_dict02)
Dict_str = "".join(my_dict02)
new_dict = json.loads(Dict_str)
# print(new_dict)
final_dict = new_dict.get('result')//写入json
with open('Ssq_data'+cnt+'.json', 'w',encoding='utf-8') as json_file:json.dump(final_dict, json_file, indent=4, ensure_ascii=False)//建立数据库sqlite
conn = sqlite3.connect('Ssqdata'+cnt+'.sqlite')
cur = conn.cursor()
//建立表格
cur.executescript('''
DROP TABLE IF EXISTS Ssq;
DROP TABLE IF EXISTS RE;
DROP TABLE IF EXISTS DATE;
DROP TABLE IF EXISTS BL;
DROP TABLE IF EXISTS Red;
DROP TABLE IF EXISTS Blue;CREATE TABLE Ssq (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,code   TEXT UNIQUE,date   INTEGER,red    INTEGER,blue   INTEGER
);CREATE TABLE DATE (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,date   TEXT NOT NULL
);  CREATE TABLE RE (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,red   TEXT NOT NULL
);  
CREATE TABLE BL (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,blue   TEXT NOT NULL
);    CREATE TABLE Red (id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,red    TEXT UNIQUE
);CREATE TABLE Blue (  id     INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,blue   TEXT UNIQUE)
''')
//读入刚刚建立的json数据
str_data = open('Ssq_data'+cnt+'.json',mode='r', encoding='utf-8')
json_data = json.load(str_data)
//写入数据
for entry in json_data:code = entry['code']date = entry['date']red = entry['red']blue = entry['blue']cur.execute('''INSERT OR IGNORE INTO Ssq (code,date,red,blue)VALUES ( ?,?,?,? )''', (code, date, red, blue))cur.execute('SELECT id FROM Ssq WHERE code = ? ', (code,))cur.execute('''INSERT OR IGNORE INTO DATE (date)VALUES ( ? )''', (date,))cur.execute('SELECT id FROM DATE WHERE date = ? ', (date,))cur.execute('''INSERT OR IGNORE INTO RE (red)VALUES ( ? )''', (red,))cur.execute('SELECT id FROM RE WHERE red = ? ', (red,))cur.execute('''INSERT OR IGNORE INTO Red (red)VALUES ( ? )''', (red,))cur.execute('SELECT id FROM Red WHERE red = ? ', (red,))cur.execute('''INSERT OR IGNORE INTO BL (blue)VALUES ( ? )''', (blue,))cur.execute('SELECT id FROM BL WHERE blue = ? ', (blue,))cur.execute('''INSERT OR IGNORE INTO Blue (blue)VALUES ( ? )''', (blue,))cur.execute('SELECT id FROM Blue WHERE blue = ? ', (blue,))conn.commit()book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('双色球')//建立sheet
//建立表头
sheet.write(0, 0, '期号')
sheet.write(0, 1, '开奖日期')
sheet.write(0, 2, '红球')
sheet.write(0, 3, '蓝球')
index =1
//写入数据
for entry in json_data:code = entry['code']date = entry['date']red = entry['red']blue = entry['blue']sheet.write(index, 0, code)sheet.write(index, 1, date)sheet.write(index, 2, red)sheet.write(index, 3, blue)index += 1
book.save(u"Ssq_data"+cnt+".xls")//保存表格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44521.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双色球

最近身边很多人玩双色球。。我也买了几期。 下面是双色球模拟程序&#xff0c;代码如下&#xff1a; package Test;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList;…

双色球的概率

为什么80%的码农都做不了架构师&#xff1f;>>> 双色球所有的组合数&#xff1a;33x32x31x30x29x28/6/5/4/3/2/1x1617721088。因此随机买一注的话&#xff0c;中头奖的概率约为“一千七百七十二万分之一”。最近一期双色球为15028期&#xff0c;销售额为318 360 50…

java 随机生成双色球

1.描述 输入注数&#xff0c;Java随机生成双色球 2.代码 import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import java.util.Scanner;public class Two_color_ball {// 随机生成双色球 前区 01-33 取6个数 后区…

诗歌与词曲收藏

《和子由渑池怀旧》-&#xff08;宋&#xff09;苏轼 人生到处知何似&#xff0c;应似飞鸿踏雪泥。 泥上偶然留指爪&#xff0c;鸿飞那复计东西。 老僧已死成新塔&#xff0c;坏壁无由见旧题。 往日崎岖还记否&#xff0c;路长人困蹇驴嘶。 《年轻的心》-席慕容 不再回头的 …

【情人节表白神器:送她一个HTML动态表白网站 带源码】

ChatGPT 介绍 ChatGPT 是由 OpenAI 开发的高级语言模型。它是一种基于变换器的神经网络&#xff0c;已经在互联网上的大量文本数据上进行了训练。这使得 ChatGPT 具有很强的语言理解能力&#xff0c;能够生成人类般的文本内容&#xff0c;如回答问题、生成摘要、翻译等。 近期…

基础知识6

知乎上的面试题&#xff1a;https://zhuanlan.zhihu.com/p/546032003 一、Topk问题以及变种&#xff0c;各种解法 微博的热门排行就属于 TopK 问题 TopK 一般是要求在 N 个数的集合中找到最小或者最大的 K 个值&#xff0c;通常 N 都非常得大。 算法的优点是不用在内存中读入全…

美云智数孔凡实:工业软件“突围战”——强化核心技术+渠道共赢生态丨数据猿专访...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 “仿真和数字孪生是企业数字化发展中的刚需的&#xff0c;不论是什么制造业&#xff0c;都会有产品&#xff0c;有产品就会有制造的仿真。”——美云智数渠道产品BU总经理 孔凡实 随着元宇宙概念的火热&#xff0c;数字孪生…

日语毕业论文日文参考文献怎么找?

要说什么东西能够让一位当代大学生茶饭不思、日渐消瘦&#xff0c;那么论文一定能够排得上号。近些年&#xff0c;学术不端的行为在学术界受到越来越多的关注&#xff0c;对于学位论文的要求也越来越高。大家都知道&#xff0c;写出一篇学位论文很难。写出一篇日语毕业论文更是…

GPT 吞噬一切!我们还需要编程语言吗?

作者 | GPT-4 责编 | 唐门教主 出品 | 《智能之境》&#xff0c;一个由 AIGC 创作的栏目 编者按 「智能之境」专栏更新&#xff1a;AGI 的未来&#xff0c;究竟属于 Rust 还是 Mojo&#xff1f;或者我们还需要编程语言吗&#xff1f; LLVM 之父、苹果的编程语言 Swift 之父、新…

ChatGPT 技术首发上车,集度汽车官宣将融合文心一言;谷歌自研数据中心芯片取得新进展;Firefox 110 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

第三课总结吴恩达 ChatGPT Prompt 免费视频

前两课在这里&#xff1a; 总结吴恩达 ChatGPT Prompt 免费课程 第二弹进阶吴恩达 ChatGPT Prompt 技巧 今天第三课&#xff0c;两个技巧 第一个&#xff0c;Prompt 迭代开发 熟悉我号《有关SQL》的朋友都知道&#xff0c;SQL 调优有经典的三板斧&#xff0c;最激动人心的是第三…

吴恩达 Chatgpt prompt 工程--5.Transforming

探索如何将大型语言模型用于文本转换任务&#xff0c;如语言翻译、拼写和语法检查、音调调整和格式转换。 Setup import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopenai.api_key os.getenv(OPE…

吴恩达 Chatgpt prompt 工程--2.Iterative-prompt

迭代分析和完善prompts&#xff0c;以从产品概况表中生成营销副本。 Setup import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopenai.api_key os.getenv(OPENAI_API_KEY)def get_completion(prom…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--07 Expanding

07 Expanding 本节示例如何用ChatGPT生成一封电子邮件的回复。 1) 定制化情绪 给定客户评论&#xff0c;我们根据评论内容和情绪产生定制的回复。下面是给定情感&#xff08;positive/negative&#xff09;&#xff0c;让ChatGPT产生相应回复的prompt。 """…

吴恩达ChatGPT课爆火:AI放弃了倒写单词,但理解了整个世界

明敏 杨净 发自 凹非寺量子位 | 公众号 QbitAI 没想到时至今日&#xff0c;ChatGPT竟还会犯低级错误&#xff1f; 吴恩达大神最新开课就指出来了&#xff1a; ChatGPT不会反转单词&#xff01; 比如让它反转下lollipop这个词&#xff0c;输出是pilollol&#xff0c;完全混乱。 …

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在&#xff0c;使用 Prompt 可以快速开发一个应用程序&#xff0c;但是一个应用程序可能需要多次写Prompt&#xff0c;并对 LLM 的输出结果进行解析。因此&#xff0c;需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

国际海运出口的操作流程是怎样的?

国际海运运输因为方便快捷以及运费低等特点&#xff0c;一直以来是大多数外贸企业出口货物物流运输的首选&#xff0c;然而新进入外贸行业的朋友们&#xff0c;对于海运出口流程还不是很了解&#xff0c;今天箱讯小编就为大家来介绍下。 海运出口操作流程如下&#xff1a; 1、…

用Python赚钱的方法有哪些?

很多人想知道用Python赚钱的方法有哪些&#xff1f;Python很容易使用&#xff0c;应用性较强。可以通过使用Python开发小程序、抓取数据、游戏开发、兼职编程老师&#xff0c;发展副业的方式来赚钱。 用Python赚钱的方法&#xff1a; 1、某宝搜python程序      可以到某宝…

学python可以做什么兼职-Python兼职收入过万?用Python做项目真的这么赚钱吗?

今天给大家分享一下2位前辈业余接兼职做的一些Python项目。我在这里想说&#xff0c;无论你是自学还是进培训班&#xff0c;只要把Python学好&#xff0c;钱自然而来。 问&#xff1a;请问用Python可以接哪些兼职的活赚钱? 1兼职费用足够学费生活费 恰巧上学期间接过一些外…

Midjourney指令操作、promt框架、参数设置教程

引言&#xff1a;基于Chatgpt的应用如雨后春笋&#xff0c;这波浪潮正当时。最近在摸索图片生成有价值的应用场景&#xff0c;使用过程中整理了一些指令秘籍&#xff0c;一同分享出来。 1、原理 Midjourney的人工智能绘画技术基于GPT-3.5模型&#xff0c;使用了先进的神经网络…