内容纲要
爬取蓝桥杯训练题库的数据
简言
已经保存为excel文件,下载链接,密码:rlbc
数据爬取自网站(https://www.dotcpp.com/oj/problemset.php?page=1&mark=6)
源代码
# -*- coding:UTF-8 -*-
# 爬取蓝桥杯训练题库
# 导入requests模块,发起网络请求
import requests
# 导入解析html,xml的xml路径语言库
from lxml import etree
# 导入json
import json
# 导入 xlwt(excel文件写入模块)
import xlwt
# 获取单个页面的html信息
def getOnePage(n):
# 模拟浏览器身份进行访问 字典{}
header = {
'User agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0'
}
# 目标地址target 格式化字符串
target = f'https://www.dotcpp.com/oj/problemset.php?page={n}&mark=6'
# get请求页面源码
req = requests.get(url = target,headers = header)
# 设定返回文本的编码格式
req.encoding = req.apparent_encoding
# 返回html的文本信息
return req.text
# 获取所提取html信息的迭代对象
def prase(text):
# 初始化获取的文本
html = etree.HTML(text)
# 根据页面结构获取需要的信息
# Tids中的tr[2]项跟具体网页结构相关
Tids = html.xpath('//td[2]/span[@class = "center"]/text()')
Tnames = html.xpath('//span[@class = "left"]/a/text()')
Threfs = html.xpath('//span[@class = "left"]/a/@href')
Tmarks = html.xpath('//td[4]/a/text()')
Ttypes = html.xpath('//td[5]/a/text()')
# item 字典保存每个项
item = dict()
# zip函数(打包)/zipped函数(解包)
for Tid,Tname,Thref,Tmark,Ttype in zip(Tids,Tnames,Threfs,Tmarks,Ttypes):
item['id'] = Tid
item['name'] = Tname
item['href'] = Thref
item['mark'] = Tmark
item['type'] = Ttype
# 生成器
yield item
# 保存数据到Json文件
def save2file_json(data):
with open('蓝桥杯训练题库爬取数据.json','a',encoding = 'utf-8') as f:
# 把data从 字典/列表 转换成字符串
data = json.dumps(data,ensure_ascii=False) + ',\n'
# 将data字符串写入文件f
f.write(data)
# 保存数据到excel文件
def save2file_excel():
# 如果需要多次打开进行写入,创建本地文件语句应避免放入循环
myxls = xlwt.Workbook()
sheet1 = myxls.add_sheet("题库数据")
index = ['id','name','href','mark','type']
for i in range(5):
sheet1.write(0,i,index[i])
# 需要爬取的页码
pageList = []
for i in range(1,18):
pageList.append(i)
for pageId in pageList:
print("正在爬取第"+str(pageId)+"个页面")
data = getOnePage(pageId)
items = prase(data)
# 有多页数据需要写入,设定每一写入的起始行i
i = (pageId-1)*25+1 #第一行为标题
for item in items:
for j in range(5):
if(j == 2):
href = "https://www.dotcpp.com" + item[index[j]]
sheet1.write(i,j,href)
else:
sheet1.write(i,j,item[index[j]])
i += 1
myxls.save("蓝桥杯训练题库爬取数据.xls")
# 运行函数
def runGetData():
# 需要爬取的页码
pageList = []
for i in range(1,18):
pageList.append(i)
for i in pageList:
print("正在爬取第"+str(i)+"个页面")
data = getOnePage(i)
items = prase(data)
for item in items:
save2file_json(item)
if __name__ == "__main__":
runGetData()
# save2file_excel()