用python爬取高考网历年高考分数线
# 导入爬虫的库
import requests
from lxml import etree
# 导入画图库
from pyecharts.charts import Bar, Line, Pie
from pyecharts import options as opts
# 导入数据库连接库
import pymysql
# 定义函数test(),功能爬取网站数据
def test():
# 定义爬取的连接
url = "http://www.gaokao.com/yunnan/yngkcj/"
# 使用rs获取返回值
rs = requests.get(url)
# 定义rs的字符集格式
rs.encoding = "gbk"
# 将网页的文本信息传给html
html = rs.text
# 将网页转化为可以分析的格式
myHtml = etree.HTML(html)
# 获取网页上的年份
nian = myHtml.xpath("//tr[@class='wkTit']/th/text()")
# 将年转化为字符串列表
year = []
for i in range(0, 11):
year.append(nian[i])
# 打印年份
print(year)
# 获取网页上的文文科和理科的一本线成绩
one = myHtml.xpath("//tr[@class='c_blue']/td/text()")
# 将文科一本线化为字符串列表,同时将“-”替换为“0”
one1 = []
for i in range(1, 12):
one1.append(one[i].replace("\r\n\t\t\t\t", "").replace("-", "0"))
one2 = []
# 将理科一本线化为字符串列表,同时将“-”替换为“0”
for i in range(25, 36):
one2.append(one[i].replace("\r\n\t\t\t\t", "").replace("-", "0"))
# 获取网页上的文文科和理科的二本线成绩
two = myHtml.xpath("//tr[@class='c_white']/td/text()")
# 将文科二本线化为字符串列表,同时将“-”替换为“0”
two1 = []
for i in range(1, 12):
two1.append(two[i].replace("\r\n\t\t\t\t", "").replace("-", "0"))
# 将理科二本线化为字符串列表,同时将“-”替换为“0”
two2 = []
for i in range(25, 36):
two2.append(two[i].replace("\r\n\t\t\t\t", "").replace("-", "0"))
# 将所有的本科线打印出来
print(one1)
print(two1)
print(one2)
print(two2)
newList = []
# 将年份,文科、理科一本,文科、理科二本拼作一个newList
for x in zip(year, one1, two1, one2, two2):
newList.append(x)
return newList
# 定义插入函数
def insertData(myList):
# 创建数据库连接
con = pymysql.connect(host="localhost", user="root", passwd="285989", database="practice", charset="utf8")
# 创建游标对象
cur = con.cursor()
# 定义sql语句
sql = "insert into test_yunnan (year,onew,twow,onel,twol) values(%s,%s,%s,%s,%s)"
# 执行插入
num = cur.executemany(sql, myList)
if num > 0:
print("插入成功")
else:
print("插入失败")
con.commit()
cur.close()
con.close()
# 定义绘图函数,x表示年份列表,y1表示文科一本列表,y2表示文科二本列表,y3表示理科一本列表,y4表示理科二本列表
def testZhe(x, y1, y2, y3, y4):
# 定义折线图对象,大小,位置
l = Line(init_opts=opts.InitOpts(width="100%", height="800px"))
# 加入x轴的值
l.add_xaxis(x)
l.add_xaxis(x)
l.add_xaxis(x)
l.add_xaxis(x)
# 加入y轴的值
l.add_yaxis("文科一本", y1)
l.add_yaxis("理科一本", y2)
l.add_yaxis("文科二本", y3)
l.add_yaxis("理科二本", y4)
# 定义每条线的颜色
l.set_colors(["green", "pink", "red", "blue"])
# 定义生成图的文件类型,文件名
l.render("云南高考折线图.html")
print("图标生成成功!")
# 定义数据库获取函数,com表示要获取的字段,tables表示要用的数据表
def countJob(com, tables):
# 创建数据库连接
con = pymysql.connect(host="localhost", user="root", passwd="285989", database="practice", charset="utf8")
# 创建游标对象
cur = con.cursor()
# 定义sql语句
sql = "select %s from %s " % (com, tables)
# 执行查询
cur.execute(sql)
# 获取查询的结果
rs = cur.fetchall()
# 将结果转化为字符串列表
results = []
for it in rs:
for i in range(len(it)):
results.append(it[i])
print(results)
# 关闭连接
cur.close()
con.close()
return results
# 定义字符串转化为整型函数
def strToint(list):
newlist = []
for x in range(len(list)):
newlist.append(int(list[x]))
return newlist
if __name__ == "__main__":
# test()
# 存入数据库
insertData(test())
# 定义pr用于存数据库名
pr = "test_yunnan"
# x表示年份
x = countJob("year", pr)
# y1表示文科一本
y1 = strToint(countJob("onew", pr))
# y1表示文科二本
y2 = strToint(countJob("twow", pr))
# y1表示理科一本
y3 = strToint(countJob("onel", pr))
# y1表示理科二本
y4 = strToint(countJob("twol", pr))
# 传入参数
testZhe(x, y1, y2, y3, y4)