用python爬取杭电oj的数据
暑假集训主要是在杭电oj上面刷题,白天与算法作斗争,晚上望干点自己喜欢的事情!
首先,确定要爬取哪些数据:
如上图所示,题目ID,名称,accepted,submissions,都很有用。
查看源代码知:
所有的数据都在一个script标签里面。
思路:用beautifulsoup找到这个标签,然后用正则表达式提取。
话不多说,上数据爬取的代码:
import requests
from bs4 import BeautifulSoup
import time
import random
import re
from requests.exceptions import RequestException
prbm_id = []
prbm_name = []
prbm_ac = []
prbm_sub = []
def get_html(url): # 获取html
try:
kv = {'user-agent': 'Mozilla/5.0'}
r = requests.get(url, timeout=5, headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
random_time = random.randint(1, 3)
time.sleep(random_time) # 应对反爬虫,随机休眠1至3秒
return r.text
except RequestException as e: # 异常输出
print(e)
return ""
def get_hdu():
count = 0
for i in range(1, 56):
url = "http://acm.hdu.edu.cn/listproblem.php?vol=" + str(i)
# print(url)
html = get_html(url)
# print(html)
soup = BeautifulSoup(html, "html.parser")
cnt = 1
for it in soup.find_all("script"):
if cnt == 5:
# print(it.get_text())
str1 = it.string
list_pro = re.split("p\(|\);", str1) # 去除 p(); 分割
# print(list_pro)
for its in list_pro:
if its != "":
# print(its)
temp = re.split(',', its)
len1 = len(temp)
prbm_id.append(temp[1])
prbm_name.append(temp[3])
prbm_ac.append(temp[len1-2])
prbm_sub.append(temp[len1-1])
cnt = cnt + 1
count = count + 1
print('\r当前进度:{:.2f}%'.format(count * 100 / 55, end='')) # 进度条
def main():
get_hdu()
root = "F://爬取的资源//hdu题目数据爬取2.txt"
len1 = len(prbm_id)
for i in range(0, len1):
with open(root, 'a', encoding='utf-8') as f: # 存储个人网址
f.write("hdu"+prbm_id[i] + "," + prbm_name[i] + "," + prbm_ac[i] + "," + prbm_sub[i] + '\n')
# print(prbm_id[i])
if __name__ == '__main__':
main()
爬取数据之后,想到用词云生成图片,来达到数据可视化。
本人能力有限,仅根据AC的数量进行分类,生成不同的词云图片。数据分析代码如下:
import re
import wordcloud
from scipy.misc import imread # 这是一个处理图像的函数
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
import os
prbm_id = []
prbm_name = []
prbm_ac = []
prbm_sub = []
def read():
f = open(r"F://爬取的资源//hdu题目数据爬取2.txt", "r", encoding="utf-8")
list_str = f.readlines()
for it in list_str:
list_pre = re.split(",", it)
prbm_id.append(list_pre[0].strip('\n'))
prbm_name.append(list_pre[1].strip('\n'))
prbm_ac.append(list_pre[2].strip('\n'))
prbm_sub.append(list_pre[3].strip('\n'))
def data_Process():
for it in range(0, len(prbm_ac)):
# print(prbm_sub[it])
root = "F://爬取的资源//词语统计.txt"
num1 = int(prbm_ac[it])
# num2 = int(prbm_ac[it])*1.0/int(prbm_sub[it])
if 5000 <= num1 <= 10000: # 分类
with open(root, 'a', encoding='utf-8') as f: # 写入txt文件,用于wordcloud词云生成
for i in range(0, int(num1/100)): # num1/100,这里可根据num1,除数变化
f.write(prbm_id[it] + ' ')
def main():
read()
data_Process()
text = open(r"F://爬取的资源//词语统计.txt", "r", encoding='utf-8').read()
# 生成一个词云图像
back_color = imread('F://爬取的资源//acm.jpg') # 解析该图片
w = wordcloud.WordCloud(background_color='white', # 背景颜色
mask=back_color, # 以该参数值作图绘制词云,这个参数不为空时,width和height会被忽略
width=300,
height =100,
collocations=False # 去掉重复元素
)
w.generate(text)
plt.imshow(w)
plt.axis("off")
plt.show()
os.remove("F://爬取的资源//词语统计.txt")
w.to_file("F://爬取的资源//hdu热度词云5.png")
if __name__ == '__main__':
main()
生成的图片效果展示如下:
词云是根据每个分类里面,ac的数量生成的。
仅以此,向广大在杭电上刷题的苦逼acmer们,表达此刻心中的敬意。愿每位acmer都能勇往直前,披荆斩棘。
用python爬取杭电oj的数据的更多相关文章
- 爬取杭电oj所有题目
杭电oj并没有反爬 所以直接爬就好了 直接贴源码(参数可改,循环次数可改,存储路径可改) import requests from bs4 import BeautifulSoup import ti ...
- 吴裕雄--天生自然PYTHON爬虫:使用Selenium爬取大型电商网站数据
用python爬取动态网页时,普通的requests,urllib2无法实现.例如有些网站点击下一页时,会加载新的内容,但是网页的URL却没有改变(没有传入页码相关的参数),requests.urll ...
- python 爬取天猫美的评论数据
笔者最近迷上了数据挖掘和机器学习,要做数据分析首先得有数据才行.对于我等平民来说,最廉价的获取数据的方法,应该是用爬虫在网络上爬取数据了.本文记录一下笔者爬取天猫某商品的全过程,淘宝上面的店铺也是类似 ...
- Python爬取6271家死亡公司数据,一眼看尽十年创业公司消亡史!
小五利用python将其中的死亡公司数据爬取下来,借此来观察最近十年创业公司消亡史. 获取数据 F12,Network查看异步请求XHR,翻页. 成功找到返回json格式数据的url, 很多人 ...
- Python爬取6271家死亡公司数据,看十年创业公司消亡史
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 朱小五 凹凸玩数据 PS:如有需要Python学习资料的小伙伴可以加 ...
- Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 胡萝卜酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- Python爬取上交所一年大盘数据
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 半个码农2018 PS:如有需要Python学习资料的小伙伴可以加点 ...
- Python爬取某网站文档数据完整教程(附源码)
基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...
- 使用python爬取东方财富网机构调研数据
最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...
随机推荐
- thinkphp 单图上传组建成数组然后追加到一个字段
//上传的数组字段 $note1 = input('note1'); $note2 = input('note2'); $note3 = input('note3'); $note4 = input( ...
- scala 2.11.x/spec/03-types.md
scala/spec/03-types.md title: Types layout: default chapter: 3 --- Types Type ::= FunctionArgTypes ' ...
- ubuntu安装输入法
sudo apt-get install ibus-pinyin sudo ibus-setup
- JS闭包解析
三点注意事项 JS作用域传送门 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域). JS中的作用域链,内部的作用域可以访问到外部作用域中的变量和方法,而外部作用域不能访问内部作用域的变量和 ...
- LeetCode题解39.Combination Sum
39. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T ...
- 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- [Swift]LeetCode301. 删除无效的括号 | Remove Invalid Parentheses
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...
- [Swift]LeetCode346. 从数据流中移动平均值 $ Moving Average from Data Stream
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- [Swift]LeetCode679. 24点游戏 | 24 Game
You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated ...
- [Swift]LeetCode707. 设计链表 | Design Linked List
Design your implementation of the linked list. You can choose to use the singly linked list or the d ...