利⽤python爬⾍抓取OJ上做题信息(终结版)
import webbrowser
import re
import urllib
#获取hdu⽹页
def getHtml_hdu(url):
page = urllib.urlopen(url)
html = ad()
#unicodehtml = html.decode("utf-8")
#return unicodehtml
return html
#获取poj⽹页
def getHtml_poj(url):
page = urllib.urlopen(url)
html = ad()
#unicodehtml = html.decode("utf-8")
#return unicodehtml
return html
#获取cug⽹页
def getHtml_cug(url):
page = urllib.urlopen(url)
html = ad()
unicodehtml = html.decode("utf-8")
return unicodehtml
#获取hdu中⽤户信息
def zhenghe_hdu(str1,userid,imgre):
html=getHtml_hdu( str1+userid )
return re.findall(imgre,html)
#获取cug中⽤户信息
def zhenghe_cug(str1,userid,imgre):
html=getHtml_cug( str1+userid )
return re.findall(imgre,html)
#获取poj中⽤户信息
爬虫可以干什么
def zhenghe_poj(str1,userid,imgre):
html =getHtml_poj( str1+ userid)
return re.findall(imgre,html)
#⽂件读出⽤户账号进⾏统计
def readFile(result_cug,result_hdu,result_poj):
file_object = open("",'r')
reg_cug = r'<td>Solved<td align=center><a href=.*?>(.*?)</a>'
imgre_cug = repile(reg_cug)
reg_hdu = r'<tr><td>Problems Solved</td><td align=center>(.*?)</td></tr>'
imgre_hdu = repile(reg_hdu)
reg_poj = '<tr><td width=15% align=left>Solved:</td>[\s\S]*?<td align=center width=25%><a href=.*?>(.+?)</a></td>'
imgre_poj = repile(reg_poj)
#将结果输出到html⽹页
html = open('OJ.html', 'w')
html.write("""
<html>
<head>
<title>cug--hdu--poj统计</title>
<style>img{float:left;margin:5px;}</style>
<style>img{float:left;margin:5px;}</style>
</head>
<body>
""")
html.write("""
<center><table width=50%><tr><td colspan=3 align=left>
</form></td><td colspan=3 align=right>
</td></tr><tr class='toprow'>
<td><b>Account</b>
<td><b>cugOJ</b>
<td><b>hdOj</b>
<td><b>poj</b>
<td><b>sum</b>
""")
alist = []  #定义⼀个列表
for line in file_object:
line=line.strip('\n')    #去掉读取的每⾏的"\n"
list_hdu = zhenghe_hdu(result_hdu,line,imgre_hdu)
list_cug = zhenghe_cug(result_cug,line,imgre_cug)
list_poj = zhenghe_poj(result_poj,line,imgre_poj)
if len(list_hdu) == 0:
number_hdu = 0
else:
number_hdu = eval(list_hdu[0])
if len(list_cug) == 0:
number_cug = 0
else:
number_cug = eval(list_cug[0])
if len(list_poj) == 0:
number_poj = 0
else:
number_poj = eval(list_poj[0])
alist.append([line,number_cug,number_hdu,number_poj,number_cug+number_hdu+number_poj])        print "处理完⼀个⽤户信息"
for i in range(len(alist)):    #冒泡排序
for j in range(len(alist)):
if alist[i][4] > alist[j][4]:
tmp = alist[i]
alist[i] = alist[j]
alist[j] = tmp
for lst in alist:  #输出到⽹页
html.write("<p></p>")
html.write("<tr>")
html.write("<td>%s </td>" % lst[0] )
html.write("<td>%s </td>" % str(lst[1]) )
html.write("<td>%s </td>" % str(lst[2]) )
html.write("<td>%s </td>" % str(lst[3]) )
html.write("<td>%s </td>" % str(lst[4]) )
html.write("</table></body><ml>")
html.write('</body></html>')
html.close()
webbrowser.open_new_tab('OJ.html') #⾃动打开⽹页
result_hdu = "acm.hdu.edu/userstatus.php?user="
result_cug = "acm.cug.edu/JudgeOnline/userinfo.php?user="
result_poj = "/userstatus?user_id="
print "正在⽣成html⽹页......"
readFile(result_cug,result_hdu,result_poj)
print "html⽹页⽣成完毕,⾃动打开"
这个python爬⾍程序的主要功能是爬取三个OJ(杭电,北⼤,地⼤)上的做题信息并进⾏题⽬的统计。
输⼊是昵称,其中有些⼈在⼏个OJ上的注册昵称都是⼀样的,有些不是,所以统计出来有些⼈在某个Oj上做题信息为0.要读取的⽂件的信息如下图:
运⾏效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。