文章目录

  • 1. 背景
  • 2. 前期准备
  • 3. 获取网页内容
  • 4. 内容处理
    • 4.1. Limit
    • 4.2. Problem Description
    • 4.3. Input
    • 4.4. Output
    • 4.5. Sample Input & Output
    • 4.6. Note
    • 4.7. Source
  • 5. 输出

1. 背景

最近做题的时候要写一些题解,在把牛客网的题目复制下来的时候,数学公式的处理比较麻烦,所以我用Pythonseleniumurllib.requestBeautifulSoup4库对题目信息进行了爬取,写题解的时候时间节约了很多。

考虑到大家可能也会遇到同样的问题,写一篇笔记分享给大家。

2. 前期准备

安装seleniumurllibBeautifulSoup库。

pip3 install urllib
pip3 install selenium
pip3 install beautifulsoup4

3. 获取网页内容

以 牛客网 NC204552 咪咪游戏 为例。

# 导入库
import urllib.request
import bs4
import time
from bs4 import BeautifulSoup
from selenium import webdriver# 题目属性
problemId = "204552"
# 打开浏览器,模拟登陆
# 此处用的是Chrome,如果没有安装可以替换为其他支持的浏览器
driver = webdriver.Chrome()

获取网页内容

# 获取页面内容
# 题目链接
url = f"https://ac.nowcoder.com/acm/problem/{problemId}"
# 打开网页
driver.get(url)
# 网页加载等待时间
time.sleep(3)
# 找到 输入 用户名 和密码框,并且设置内容
username = driver.find_element_by_id('jsEmailIpt')
# 输入账号名,xxx替换为自己的账户名
username.send_keys('xxx')time.sleep(1)
password = driver.find_element_by_id('jsPasswordIpt')
#输入密码,xxx替换为自己的密码
password.send_keys('xxx')time.sleep(1)
# 分析网页,找到登录按钮
login = driver.find_elements_by_css_selector('div[class=col-input-login] a')[0]
# 点击按钮
login.click()time.sleep(3)
# 格式化源代码
soup = BeautifulSoup(driver.page_source,'lxml')
# 退出浏览器
driver.quit()

存储和预处理

# 存储
data_dict = {}
# 找到主体内容
mainContent = soup.find_all(name="div", attrs={"class" :"terminal-topic"})[0]# 去除公式的重复html元素
for each in mainContent.find_all('mrow'):each.decompose()
for each in mainContent.find_all(name="span", attrs={"class" :"katex-html"}):each.decompose()
# 更换换行符
for each in mainContent.find_all('br'):each.replace_with("\n\n")

4. 内容处理

4.1. Limit

先从比较简单的信息入手,找到题目标题、时间、和内存限制。

# Limit
# 找到题目标题、时间、和内存限制
div = mainContent.find_all(name="div", attrs={"class":"subject-item-wrap"})[0].find_all("span")
# 放入字典中存储
data_dict['Title'] = f"牛客网 NC{problemId} " + soup.title.contents[0]
# Time Limit
data_dict['Time Limit'] = div[0].contents[0].split(':')[1]
# Memory Limit
data_dict['Memory Limit'] = div[1].contents[0].split(':')[1]

定义函数,处理主体内容中诡异的空格和公式的符号。

def divTextProcess(div):"""处理<div>标签中的文本内容"""
#     获取文本strBuffer = div.get_text()
#     替换公式标记strBuffer = strBuffer.replace("{", " $").replace("}", "$ ")
#     去除多个空格strBuffer = strBuffer.replace("  ", "")
#     去除多个换行符strBuffer = strBuffer.replace("\n\n\n", "\n")
#     去除内容中用\xa0表示的空格strBuffer = strBuffer.replace("\xa0", "")
#     去除首位空格strBuffer = strBuffer.strip()# 返回结果return strBuffer

4.2. Problem Description

获取题目描述

# 处理题目描述
div = mainContent.find_all(name="div", attrs={"class": "subject-question"})[0]
data_dict['Problem Description'] = divTextProcess(div)

4.3. Input

输入描述

div = mainContent.find_all(name="pre")[0]
data_dict['Input'] = divTextProcess(div)

4.4. Output

输出描述

div = mainContent.find_all(name="pre")[1]
data_dict['Output'] = divTextProcess(div)

4.5. Sample Input & Output

输入样例,用代码框环境包围。

# Input
div = mainContent.find_all(name="div", attrs={"class":"question-oi-cont"})[0]
data_dict['Sample Input'] = "```cpp" + div.get_text() + '```'
# Onput
div = mainContent.find_all(name="div", attrs={"class":"question-oi-cont"})[1]
data_dict['Sample Output'] = "```cpp" + div.get_text() + '```'

4.6. Note

备注

# 若有备注
if len(mainContent.find_all(name="pre")) >= 5:div = mainContent.find_all(name="pre")[-1]data_dict['Note'] = divTextProcess(div)

4.7. Source

题目链接

data_dict['Source'] = '[' + data_dict['Title'] + ']' + '(' + url + ')'

5. 输出

for each in data_dict.keys():print('### ' + each + '\n')print(data_dict[each].replace("\n\n**", "**").replace("**\n\n", "**") + '\n')

下面是最后的输出结果

### Title牛客网 NC204552 咪咪游戏### Time LimitC/C++ 1秒,其他语言2秒### Memory LimitC/C++ 524288K,其他语言1048576K### Problem Description牛牛最近喜欢玩咪咪游戏,于是自己写了个程序编了个游戏让牛妹来玩。游戏是这样的: 牛牛有一个长的字符串(只包26含个小写字母),他想让牛妹判断这个字符串是好的。定义一个串是好的:这个串是由连续的mq连接而成的。 比如 $mqmq$ 说明这个串是好的, $mqmqm$ 或 $mqmqx$ 都是不好的。现在牛牛 想问牛妹这个串是否是好的,如果好的输出 $Yes$ ,否则输出 $No$### Input第一行一个整数Q,表示询问次数就下来Q行,一个字符串$s### OutputQ行,每行输出 $Yes$ 或 $No$### Sample Input// 这里会有```cpp代码环境,在这里为了展示方便去掉了
4
mqmq
mqmqm
mqakioi
mqqmmq### Sample OutputYes
No
No
No### Note对于 $60\%$ 的数据满足: $|s|<=10,Q<=10$ 且保证只出现m,q两个字符对于 $100\%$ 的数据: $|s| <=10^5,Q<=10$ 对于所有数据保证只出现26个英文小写字母### Source[牛客网 NC204552 咪咪游戏](https://ac.nowcoder.com/acm/problem/204552)

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

公众号:复杂网络与机器学习

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。

使用Python网络爬虫抓取牛客网题目相关推荐

  1. 牛客网获取输入rowinput_Python爬虫入门例题:抓取牛客网题目

    最近做题的时候要写一些题解,在把牛客网的题目复制下来的时候,数学公式的处理比较麻烦,所以我用Python的selenium.urllib.request和BeautifulSoup4库对题目信息进行了 ...

  2. python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  3. python爬虫微信朋友圈怎么发文字_如何利用Python网络爬虫抓取微信朋友圈的动态(上)...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  4. python爬虫好友聊天记录_利用Python网络爬虫抓取微信好友的签名及其可视化展示...

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  5. python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  6. python爬虫能爬取微信密码吗_如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例...

    今天我们继续focus on微信,不过这次给大家带来的是利用Python网络爬虫抓取微信好友总数量和微信好友男女性别的分布情况.代码实现蛮简单的,具体的教程如下. 相信大家都知道,直接通过网页抓取微信 ...

  7. 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  8. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  9. python爬虫好友图片_利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

最新文章

  1. visualVM 安装使用
  2. Control Compliance Suite,听说过吗?
  3. 51单片机串行口c语言编程,51单片机串口通信c语言编程
  4. Dell服务器Ubuntu 18.04 双显卡(2080ti)搭建深度学习环境(CUDA 10.1/cuDNN 7.6/Tensorflow 1.14).md...
  5. 【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )
  6. 论文笔记:Autoregressive Tensor Factorizationfor Spatio-temporal Predictions
  7. hdu 4831(线段树---待解决)
  8. Golang 规则引擎原理及实战
  9. 应用程序挂起、复原与终止— IOS开发
  10. Windows Azure 云计算服务: 怎样按需选择并计算它将花费多少钱呢?
  11. C# WPF 多个window 相互覆盖的次序控制 不用topmost
  12. 为什么普通红包自己不能领_为什么窗帘不能用洗衣机洗呢?千万别让窗帘砸在自己手里!...
  13. 纯前端html导出pdf(jsPDF.js)-分页-不分页
  14. Anaconda版本选择 Python3.6版本的Anaconda下载
  15. 高斯误差函数erf的数值计算方法(C++实现)
  16. cmos与非门电路、或非门电路
  17. 新型城镇化红利,碧桂园的确定性在哪里?
  18. 200行代码实现N子棋(以五子棋为例)
  19. 40K成功入职:六年开发终获小米Offer(附面经+面试题+答案详解)
  20. 轴承座冲压模具设计(论文+CAD图纸+开题报告+任务书)

热门文章

  1. 机房计算机课提交作业,信息技术课机房上课规则
  2. 助力提升研发效能的“黄金三角”
  3. liunx下通过Canal将MySQL数据同步到Elasticsearch
  4. ajax访问如何重定向,ajax请求重定向
  5. N880E从4.0刷回2.3
  6. LoadRunner 12.02 进行录制脚本时提示无Internet访问
  7. opnet学习001,入门的好例子
  8. 转载 顺藤摸瓜:让盗号者得不偿失
  9. 不平静,就不会幸福(转)
  10. 常见安全产品默认口令