决战高考,帮你秒变成语之王

2023-10-24 12:40
文章标签 变成 高考 语之王 决战

本文主要是介绍决战高考,帮你秒变成语之王,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

又是一年高考季

每年的这时候我都要发一条朋友圈,要高考了好紧张,哈哈...
没开始做公众号时,在公司内网隔三差五发篇博文,感觉自己思维好活跃。可从上周五写第一篇公众号开始,说巧不巧的工作开始忙起来了。每天赶着最后一班车回家,吃完饭和孩子玩一会就快10点了。然后坐在电脑旁边稳定半天的情绪开始学习,等学的差不多开始搞公众号。这一周1天通宵5天3点后,感觉身体被掏空。但希望能坚持每天发一篇真的能给大家带来帮助的文章,那么今天发什么?如题...

成语之王

想想今天高考,第一门就是语文,所以考虑发一篇和语文有关的内容。
回忆我们那会儿考语文,第一道题肯定和成语、拼音的判断对错和修改有关。那就发这个吧!
百度了一下,找到一个haoshiwen.org的网站,对应的有一个chengyu.haoshiwen.org子域名。其中包含了很多的成语,点到每个成语中,又包含了成语、注音、释义、出处、示例、成语热度,很是不错。

网站分析

坦白说,这个网站真的比较简单,就是PHP(世界上最好的语言...)搭建的静态网站。
网站将成语通拼音首字母从A-Z进行了划分,然后每个字母一页一页的记录,网址模式如下:
http://chengyu.haoshiwen.org/list.php?t=A&page=2

5847426-566ee3de370d8e37.png
成语首页.png

每个成语的链接点进去就是成语详情,url类似如下:
http://chengyu.haoshiwen.org/view.php?id=40

5847426-e33a3d14440f8a84.png
成语详情.png

这样解析起来就很简单了...

  1. 我们首先创建双重for循环,character从A到Z、page 1--100,然后开始爬取网站
  2. 通过正则匹配所有href属性带有/view.php?id=数字的a标签进行网站拼接后的二次访问
  3. 进入访问页面,获取第一个table中的成语名、注音、释义、出处、示例、成语热度
  4. 成语热度的排名,进行字符串的切割后,转为int,已做成语热度排序
  5. 最终将数据进行存储
    ... 部分代码 ...def traverse_character(self):# page style: http://chengyu.haoshiwen.org/list.php?t=A&page=1url = self.url + '/list.php'for char in ascii_uppercase:for page_num in range(1, 100):params = {"t": char, "page": page_num}soup = self.get_response(url, params)links = soup.findAll("a", {"href": re.compile("/view.php\?id=\d")})if not links:continuefor link in links:t = threading.Thread(target=self.idiom_index, args=(self.url + link["href"],))t.start()time.sleep(0.1)def idiom_index(self, url):sem.acquire()try:soup = self.get_response(url)tr = soup.find("table").findAll("tr")[:6]info = {td.findAll('td')[0].text: td.findAll('td')[1].text for td in tr}info['人气'] = int(info['人气'][:-1])sql = "insert into idiom (name,speak,meaning,source,example,hot) values " \"(?,?,?,?,?,?)"self.db.insert(sql,list(info.values()))except Exception as error_info:print(error_info)finally:sem.release()... 部分代码 ...
怎么存?

其实这种数据,用postgresql和mongodb亦或者是大众常用的Mysql来搞是比较好的。但其实这里有一个小打算,就是把数据全部拿到之后做一个其他的功能,为了能轻松复制,我选择了相对性能弱但是便携的SQLite。
那选择了数据库,用什么来管理数据库链接呢? DBUtils

安装pip install DBUtils
介绍:

DBUtils is a suite of tools providing solid, persistent and pooled connections to a database that can be used in all kinds of multi-threaded environments like Webware for Python or other web application servers. The suite supports DB-API 2 compliant database interfaces and the classic PyGreSQL interface.

简而言之,DBUtils是一套为数据库提供可靠,持久和池式连接的工具,可用于各种多线程环境。我们一般使用DBUtils.PooledDB来创建一批连接池进行并发处理。常用参数如下:

参数说明
creator使用链接数据库的模块(sqllite3、pymysql...)
maxconnections连接池允许的最大连接数,0和None表示不限制连接数
mincached初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached链接池中最多闲置的链接,0和None不限制
blocking连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
maxusage一个链接最多被重复使用的次数,None表示无限制
hostip
user用户名
password密码
database数据库名
charset字符集(Mysql用的比较多,SQLite没有)

因为之前都是拿DBUtils链接数据库的,这次默认就直接改成sqlite3,结果各种报错(SQLite数据库没有host、user、password、charset的选项)。
然后好不容易配置好了,封装上常用的方法...一跑程序挂了!
SQLite本身应对多个线程并发访问过程中的冲突问题,由一个线程创建并访问的sqlite的数据库,无法允许另外一个线程进行访问,找解决办法呗,最终找到通过设置check_same_thread=False,使SQLite支持多线程并发(但并发的效果很一般)。

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/6/7 02:23
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : db_maker.pyimport sqlite3
from DBUtils.PooledDB import PooledDBclass DB_Maker:def __init__(self):self.POOL = PooledDB(check_same_thread=False,creator=sqlite3,  # 使用链接数据库的模块maxconnections=10,  mincached=2,  maxcached=5,  blocking=True,  maxusage=None,  ping=0,database='database.db',)self.check_db()def check_db(self):sql = "SELECT name FROM sqlite_master where name=?"if not self.fetch_one(sql, ('idiom',)):self.create_table()def create_table(self):print("create table ...")sql = """create table idiom ([id]            integer PRIMARY KEY autoincrement,[name]         varchar (10),[speak]      varchar (30),[meaning]      varchar (100),[source]      varchar (100),[example]      varchar (100),[hot]      int(10))"""self.fetch_one(sql)def db_conn(self):conn = self.POOL.connection()cursor = conn.cursor()return conn, cursor@staticmethoddef db_close(conn, cursor):cursor.close()conn.close()def fetch_one(self, sql, args=None):conn, cursor = self.db_connif not args:cursor.execute(sql)else:cursor.execute(sql, args)record = cursor.fetchone()self.db_close(conn, cursor)return recorddef fetch_all(self, sql, args):conn, cursor = self.db_conncursor.execute(sql, args)record_list = cursor.fetchall()self.db_close(conn, cursor)return record_listdef insert(self, sql, args):conn, cursor = self.db_connrow = cursor.execute(sql, args)conn.commit()self.db_close(conn, cursor)

程序引入threading多进程的方式,并发网页请求。主程序代码如下:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/6/7 02:52
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : IdiomCrawler.pyimport requests
from bs4 import BeautifulSoup
import re
import threading
import time
from string import ascii_uppercase
from db_maker import DB_Makerclass IdiomCrawler:def __init__(self):self.url = "http://chengyu.haoshiwen.org"self.headers = {'Host': "chengyu.haoshiwen.org",'Connection': 'keep-alive','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','user-agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')}self.db=DB_Maker()def get_response(self, url, params=None):r = requests.get(url, headers=self.headers, params=params)r.encoding = 'utf-8'soup = BeautifulSoup(r.text, "lxml")return soupdef traverse_character(self):# page style: http://chengyu.haoshiwen.org/list.php?t=A&page=1url = self.url + '/list.php'for char in ascii_uppercase:for page_num in range(1, 100):params = {"t": char, "page": page_num}soup = self.get_response(url, params)links = soup.findAll("a", {"href": re.compile("/view.php\?id=\d")})if not links:continuefor link in links:t = threading.Thread(target=self.idiom_index, args=(self.url + link["href"],))t.start()time.sleep(0.1)def idiom_index(self, url):sem.acquire()try:soup = self.get_response(url)tr = soup.find("table").findAll("tr")[:6]info = {td.findAll('td')[0].text: td.findAll('td')[1].text for td in tr}info['人气'] = int(info['人气'][:-1])sql = "insert into idiom (name,speak,meaning,source,example,hot) values " \"(?,?,?,?,?,?)"self.db.insert(sql,list(info.values()))except Exception as error_info:print(error_info)finally:sem.release()if __name__ == '__main__':sem = threading.Semaphore(5)  # 设置线程阀值Crawler = IdiomCrawler()Crawler.traverse_character()while threading.active_count() != 1:pass  # print threading.active_count()else:print('### Selenium Jobs is over!!!###')

不爬不知道一爬吓一跳,中国有这么多的成语,看了几集Flask视频了,才终于搞完。
来看看我们的数据吧....

5847426-1cec45d35e3ee4cc.png
成语总数.png

检查下有没有重复数据,结果ok:
5847426-02e7a798604a5433.png
成语筛选.png

再来看看网站排名的成语热度吧:
5847426-3bfbfe9fb8e64f63.png
网站成语热度.png

这个热度就有点坑了,明显是访问次数么,因为这个 哀哀父母是第一个词,所以热搜最高。最重要的是我不知道这是啥意思,哈哈......

辛辛苦苦把三万个成语爬下来,就这么结束了貌似不太好,抽时间拿这些数据搞点事情。
如果大家想要这份成语数据库,关注我的公众号【清风Python】,回复成语,即可获取。
好了,今天的内容就到这里,如果觉得有帮助,记得点赞支持。欢迎大家关注我的公众号,获取更多Python相关的知识,并有整理好的各类福利数据供大家下载:

5847426-90a9ec02ff01c5d9.gif
清风Python

这篇关于决战高考,帮你秒变成语之王的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275223

相关文章

div标签变成可编辑

在html页面有很多得方用到<div>标签,开始的时候要想在一个<div>标签中显示一段文本我会先到用<textArea>标签,可是<textArea>标签会随着你的拉动,框的大小也回随着改变,有时会把原来的布局拉动的变得非常难看。 有次在看书,看到div是可以编辑的标签,只要在div标签中加上属性contentEditable=true即可,要想看到div就给div高度和宽度再给个颜色,这样就

为什么From/To space的大小几乎变成 0 了呢?

文章来源 https://hllvm-group.iteye.com/group/topic/39440 一、问题描述 Attaching to process ID 26424, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.231-b11usi

Excel如何把表格变成图表

Excel如何把表格变成图表 ‌将Excel表格转换为图表‌的过程相对简单且直观,主要步骤包括准备数据、插入图表、设置图表格式等。 以下是详细的步骤说明: ‌准备数据‌:首先,在Excel表格中输入或准备好要创建图表的数据。这些数据可以是数值、类别等,具体取决于你想要展示的数据类型和图表类型。 然后全选表格,点击“Ctrl+T”创建超级表。 接着点击“Alt+F1”一键

决战Myeclipse+tomcat+jdk

http://m18814133657.blog.163.com/blog/static/23468615220149126377210/

数据库查出来的明明是时间返回却变成一串无规律的数字。解决方法 /** * 时间戳转时间格式 * @param jsondate 得到的number 型时间数 */ function

数据库查出来的明明是时间返回却变成一串无规律的数字。解决方法 /**  * 时间戳转时间格式  * @param  jsondate 得到的number 型时间数  */   function getLocalTime(jsondate) {  jsondate=""+jsondate+"";//因为jsonDate是number型的indexOf会报错 if (jsondate.ind

已经存在的项目如何变成git的一个repository

已经存在的项目如何被git管理 背景: 有一套代码很敏感,可能动不动就要不能正常工作(硬件开发常事),那改动一下下就要有个记录,就决定用git管理 已经有了服务里里docker里运行的gitbucket,已经有了开发用的电脑上的git客户端(Git-2.28.0-64-bit.exe) 很简单的方法: 开发用的电脑上安装git客户端 右键 选 create new resposito

Win11任务栏怎么变成透明?电脑任务栏透明设置攻略!

Windows 11作为微软最新的操作系统,为用户带来了许多新的功能和改进,包括任务栏的个性化设置。许多用户希望将任务栏设置为透明,以增加桌面的美观性和整洁度。本文将详细介绍几种将Win11任务栏变为透明的方法,帮助用户实现个性化的设置。 方法一:使用系统内置功能 Windows 11自带了调整任务栏透明度的功能,用户可以通过简单的设置来实现。 步骤1:打开设置 首先,按下Win+I键

全能型AI vs 专业型AI:未来AI市场的决战?

随着人工智能(AI)技术的飞速发展,AI的应用范围已从最初的学术研究扩展到商业、医疗、制造、金融等众多领域。在这个过程中,不同类型的AI产品应运而生,并逐渐成为市场的焦点。近年来,全能型AI和专业型AI之间的对比成为了讨论的热点。尤其是最近OpenAI计划推出的新AI模型代号为“草莓”,它展示了从处理复杂数学问题到进行主观营销策略等多种能力。这样一种全能型AI是否意味着未来AI的主流方向?又是

计算机毕业设计PySpark+Scrapy高考推荐系统 高考志愿填报推荐系统 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

目  录 第1章 绪论 1.1 研究背景 1.2 国内外现状 1.2.1 国外研究现状 1.2.2 国内研究现状 1.3 主要研究内容 1.4 论文框架结构 第2章 相关开发技术与理论 2.1 前端技术 1.Vue框架技术 2.Element-Plus 2.2 后端技术 1.PySpark 2.Django框架 3.Scrapy技术 2.3 协同过滤算法 1.基于

三星与海力士发力决战HBM4

在8月中旬,三星宣布正在加速推进下一代HBM(High Bandwidth Memory)的研发,目标是在今年年底前完成HBM4的设计定稿(tape-out)。而SK海力士则继续保持其竞争力,计划在10月份完成HBM4的设计定稿,这一产品将被用来支持NVIDIA的Rubin AI芯片系列,此消息由Wccftech和ZDNet报道。 除了为NVIDIA提供HBM4之外,SK海力士还计划在未来几