爬虫-爬取蓝桥杯训练题库数据

内容纲要

爬取蓝桥杯训练题库的数据

简言

已经保存为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()

发表评论