爬取高考网主页与子页的学校基本信息和往年录取分数线

  • 高考网
    • 创建Mysql数据库和存储实现
    • 先了解下高考网的一些爬取阻碍
    • 完整代码

高考网

链接: http://college.gaokao.com/schlist/a14/p1/

本章主要介绍下简单的爬取,不采用任何框架,只爬取广东省内的高校,让读者能对requests的请求方式,正则表达式与xpath的解析方式,json与MYSQL的存取方式有一定了解。

创建Mysql数据库和存储实现

首先确定自己要爬取的内容,设计数据库:

  1. 建立数据库
    gaokao_mysql_1.py
import pymysqldb = pymysql.connect(host='127.0.0.1', user='root', password='自己数据库的密码', port=3306)
cursor = db.cursor()
cursor.execute("CREATE DATABASE gaokao DEFAULT CHARACTER SET utf8mb4")
db.close()
  1. 建立数据表 :要存入的数据有:高校名称(主键)、高校校徽、高校类型、高校性质、高校隶属、高校网址、高校子页、通讯地址
    gaokao_mysql_2.py
import pymysqldb = pymysql.connect(host='127.0.0.1', user='root', password='自己数据库的密码', port=3306, db='gaokao')
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS school_data(id VARCHAR(255) NOT NULL,school_img VARCHAR(255) NOT NULL, school_type VARCHAR(255) NOT NULL, school_subjection VARCHAR(255) NOT NULL, school_nature VARCHAR(255) NOT NULL,school_url VARCHAR(255) NOT NULL,next_url VARCHAR(255) NOT NULL,local_name VARCHAR(255) NOT NULL,PRIMARY KEY (id))'
cursor.execute(sql)
db.close()
  1. 存储的代码实现
import json
import pymysql
def to_mysql(i,x):"""信息写入mysql,i为数据表名,x为字典"""table=ikeys =', '.join(x.keys())values = ', '.join(['%s'] * len(x))db = pymysql.connect(host='localhost', user='root', password='自己数据库的密码', port=3306, db='gaokao')cursor = db.cursor()sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)try:if cursor.execute(sql, tuple(x.values())):print("Successful")db.commit()except:print('Failed')db.rollback()db.close()def to_json(i,x):'''存为json格式'''json_name_true=iwith open(json_name_true,'a')as file:#indent=1表示缩进file.write(json.dumps(x,indent=1,ensure_ascii=False))


先了解下高考网的一些爬取阻碍

首页的爬取基本很顺利,主要的障碍集中在子页

1.广东省内的高校一共有五页的数据,但后两页的数据是重复的,所以我们只爬取1-3页
2.子页的分数框中,平均数是在id=“pjf”的标签内的,采用xpath批量获取时获取不到,所以我们需要多加一个xpath获取

result1 = school_html.xpath('//div[@class="tabCon5"]//tr//td[@id="pjf"]//a/text()')

3.子页的分数框中,平均数一般是在id=“pjf”的标签内,但有些标签的id=’pif_hs‘,这时我们需要单独获取id=’pif_hs‘内的数据,并将其加入到result1中

        # 处理id=’pif_hs‘的异常标签result2 = school_html.xpath('//div[@class="tabCon5"]//tr//td[@id="pjf_hs"]//a/text()')for res in result2:result1.append(res)

4.有些高校的分数线框内是不包含任何数据的,因此我们需要采用try+if语句来过滤
5.由于我们是简单的介绍下爬虫,所以并没有采用selenium来处理按钮事件。文理科的分数线都在分数框内,通过点击右上角的按钮转换,审查元素时发现,虽然文理科分数线的隐藏和显现是通过改变标签div style="display:block;"来实现的,但数据依旧留在HTML内,并不是Ajax等渲染出来的,可以获取分数框内的所有数据,再依据数据的分布规律提取和分离数据。
6.分数线首行年份与第二行年份相同的情况。

# while用于分离文理科,同时处理分数线首行年份与第二行年份相同的情况while result[0] != result[j + 6]:j += 1a = j + 6

7.少部分高校首行录取批次是空的,为了维护数据的规律性,需将空的地方替换为‘------’。

                if l / 5 not in t:#处理一些首行录取批次为None的数据,将空的地方替换为’------‘result.insert(int(a) + 4, '------')

8.我们获取的是文理科的总数据,数据的规律是:每一行的数据量为5(平均分数我们另外获取,所以不计入),所以获取的数据列表中每5个为一组数据,根据此规律就可以完整的获取数据和分离数据。

完整代码

gaokao.py

import requests
import time
import re
from lxml import etree
import save
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','Referer':'http://college.gaokao.com/schlist/a14/p1/','Host':'college.gaokao.com'}x={}
y_wen={}
y_li={}
tab = 'school_data'
json_name='school_data.json'
json1_name='school_data_li.json'
json2_name='school_data_wen.json'def gain_html(url):response = requests.get(url, headers=headers)html = response.textreturn htmldef parse_html(url):'''正则表达式爬取'''#爬取首页学校基本信息html=gain_html(url)pattern = re.compile('<dt>.*?<img src="(.*?)".*?onerror.*?alt="(.*?)".*?<strong title=.*?<a href="(.*?)".*?<li>高校类型:(.*?)</li>.*?<li>高校隶属:(.*?)</li>.*?<li>高校性质:(.*?)</li>.*?<li>学校网址:(.*?)</li>',re.S)items = re.findall(pattern, html)for item in items:x['id'] = item[1]x['school_img'] = item[0]x['school_type'] = item[3]x['school_subjection'] = item[4]x['school_nature'] = item[5]x['school_url'] = item[6]x['next_url'] = item[2]# 爬取学校页的地址信息next_url = x['next_url']school_html=gain_html(next_url)pattern = re.compile('<div class="college_msg bk">.*?<dl>.*?(通讯地址|学校地址):(.*?)"*?<br.*?联系电话:', re.S)items1 = re.findall(pattern, school_html)for item1 in items1:x['local_name'] = item1[1]time.sleep(2)#存入数据库或者json文件save.to_mysql(tab, x)save.to_json(json_name, x)#爬取分数线school_html = etree.HTML(school_html)result = school_html.xpath('//div[@class="tabCon5"]//tr//td[position()<7]/text()')# result1是平均分数的数据列表result1 = school_html.xpath('//div[@class="tabCon5"]//tr//td[@id="pjf"]//a/text()')# 处理id=’pif_hs‘的异常标签result2 = school_html.xpath('//div[@class="tabCon5"]//tr//td[@id="pjf_hs"]//a/text()')school_name = school_html.xpath('//p[@class="btnFsxBox"]//font/text()')# 单个获取id=’pif_hs‘标签中的数据存入result1for res in result2:result1.append(res)#p是获取的文理科总数据,待分离p = len(result)#q是文理科平均分数线的总数据q = len(result1)j = 0w = 0r = 0# t列表用于处理“首行缺少学历类型的分数线”t = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]try:# 首个if语句用于处理学校没有分数线数据的情况if result:# while用于分离文理科,同时处理分数线首行年份与第二行年份相同的情况while result[0] != result[j + 6]:j += 1a = j + 6# p是获取到的数据总数,a=j+6之前的数据是理科数据,后面是文科分数线的总数,l是文科分数线的总数l = p - a# u是文科平均分数总数的起始点u = int(a / 5)# if 判断是否为5的倍数(因为首行缺少录取批次的分数线总和数据不是5的倍数)if l / 5 not in t:#处理一些首行录取批次为None的数据,将空的地方替换为’------‘result.insert(int(a) + 4, '------')#获取理科分数线for i in range(0, a + 1):#按照获取的数据逻辑将数据存入jsonif w <= a - 5 and r <= a / 5:#根据获取到的数据的规律解析数据y_li['id'] = school_name[0]y_li['year'] = result[w]y_li['low'] = result[w + 1]y_li['high'] = result[w + 2]y_li['ave'] = result1[r]y_li['num'] = result[w + 3]y_li['type'] = result[w + 4]time.sleep(1)print(y_li)save.to_json(json1_name,y_li)print("存入理科成功!")#w是总分数线(除了平均数)的逻辑数w += 5#r是平均数的逻辑数r += 1'''# 获取文科分数线for i in range(0, l + 1):#根据分离后的数据规律解析数据if a <= p - 4 and u <= q:y_wen['id'] = school_name[0]y_wen['year'] = result[a]y_wen['low'] = result[a + 1]y_wen['high'] = result[a + 2]y_wen['ave'] = result1[u]y_wen['num'] = result[a + 3]y_wen['type'] = result[a + 4]time.sleep(1)print(y_wen)save.to_json(json2_name, y_wen)print("存入文科成功!")# a是总分数线(除了平均数)的逻辑数a += 5# u是平均数的逻辑数u += 1'''except:passdef main():for i in range(1, 4):url = 'http://college.gaokao.com/schlist/a14/p' + str(i) + '/'print("爬取第" + str(i) + "页")parse_html(url=url)
main()

采用requests请求+xpath与正则表达式解析+Mysql与json存取:爬取高考网主页与子页的学校基本信息和往年录取分数线相关推荐

  1. 用python爬取高考网历年高考分数线将数据放入MySQL并绘制图表

    用python爬取高考网历年高考分数线 # 导入爬虫的库 import requests from lxml import etree # 导入画图库 from pyecharts.charts im ...

  2. python+requests+ 爬取官网双色球开奖数据

    python+requests+mysql 爬取官网双色球开奖数据 分析网页数据获取方式 第一种查询方式 第二种查询方式 完整代码 分析网页数据获取方式 第一种查询方式 在官网上 可以找到多种数据查询 ...

  3. xpath爬取mooc网课程

    要求: 爬取的链接:http://www.imooc.com/course/list 爬取的内容:课程链接,课程的图片url,课程的名称,学习人数,课程描述 爬取的内容如何存储: 文件(csv): m ...

  4. 爬取知网博硕士文献及中国专利存到mysql数据库中的代码及其注意事项

    今天因为需要做了一个爬取知网博硕士论文及中国专利的爬虫,在制作的过程中遇到了不少坑,在网上查资料时都是很老的资源,在现在知网的反爬虫下不起作用,所以我来写这篇文章来供大家参考.(这篇文章主要介绍通过改 ...

  5. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

    python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...

  6. python爬虫之正则表达式(爬取妹子网图片)

    目录 正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子 ...

  7. Scrapy爬取当当网的商品信息存到MySQL数据库

    Scrapy爬取当当网的商品信息存到MySQL数据库 Scrapy 是一款十分强大的爬虫框架,能够快速简单地爬取网页,存到你想要的位置.经过两天的摸索,终于搞定了一个小任务,将当当网的商品信息爬下来存 ...

  8. 使用Python+xpath爬取知网所有中英文期刊的封面背景图片

    使用Python+xpath+beautifulsoup爬取知网所有中英文期刊的封面背景图片` import json import requests from bs4 import Beautifu ...

  9. Python爬取全书网小说全文——正则表达式的应用

    1. 引言 各位读者新年好,今天给大家带来的案例是爬取全书网小说全文,主要用到了正则表达式.我们知道,正则表达式一般用来进行格式化的精确匹配,用来爬取多文本的内容非常方便.本次采用面向过程的方法,理解 ...

最新文章

  1. Sublime Text 3中文乱码问题的解决(最有效)
  2. Vue.js 由 1 到 2 的旅程 - (1)
  3. gcc命令-更新中....
  4. python循环语句知识点_Python for 循环语句【每日一个知识点第115期
  5. 小技巧:用python迅速打印Java写 的Flink代码中的hive建表语句
  6. jQuery.sap.storage getAccessToken的技术实现
  7. 使用Jexus 容器化您的 Blazor 应用程序
  8. CodeForces:643(VK cup)
  9. Linux上的redis安装和后台启动
  10. 织梦后台对应的php文件,织梦DedeCMS后台文件列表按文件名排序的方法
  11. 斐波那契数列的性质整理
  12. 最适合物联网的开源数据库
  13. ASP.NET的HTTP请求处理方法?
  14. Mysql 对语句的长度有限制,默认是 4M
  15. 运行CATIA2018主程序setup.exe时,报错setup:Problem with VC11 Runtime installation
  16. 回复和评论功能的实现
  17. iPhone密码管理
  18. RNN(pytorch)的维度问题——用GRU实现文本分类(参考刘二大人)
  19. 计算机安全及故障处理大学论文,网络维护中故障点排除分析及处理措施论文
  20. 桂林山水甲天下,阳朔山水甲桂林

热门文章

  1. Linux:tr命令详解
  2. 疑难杂症篇(十五)--winXP下出现“安装向导无法创建文件夹‘C:\DOCUME~1\ADMIN~1\LOCALS~1\Temp\is-PCCET.tmp‘“问题的解决方案
  3. 多台服务器之前免密复制
  4. Guacamole录屏配置
  5. cisco路由器基本实验之二 默认路由的配置(Boson NetSim)
  6. MySQL select 语句指定字段查询
  7. 淘宝/天猫搜索同款的商品 API 接口返回值说明
  8. 联想 Y27q-30显示器 评测怎么样
  9. Android Binder框架实现之bindService详解
  10. C语言实现三子棋游戏(棋盘可自行扩展)