首页 🔍爬虫开发

一、开发原因

为了更好的督促学院编程俱乐部的学弟学妹们进行算法题的练习,但苦于virtual judge网络不稳定,部分同学无法进入,只能安排他们在对应的oj上刷对应的题号。但不便于统计,遂有了开发这个爬虫系统的想法。

二、功能需求

主要功能需求为以下:

  1. 能根据用户爬取各大OJ上用户AC题的数量
  2. 能够定时抓取用户信息并显示在前端页面上

三、技术栈的选择

初步构思是使用requestbs4两个python的第三方库,以及正则表达式进行网页端的爬取。

为了精简功能,初期版本会使用github action进行定时抓取,并生成html单页,然后显示在git pages上。

后期预计使用django2.15 + vue2.5进行完整功能网站的开发。

四、临时版本的设计

首先,定义一个类,类中定义一个用户名列表和一个姓名列表以及一个伪装的请求头。

get_problem函数中,使用request库函数抓取html网页,并使用beautifulsoup进行封装。

然后使用其提供的select函数,在用户信息界面的网站上右键,审查元素,

找到copy-> copy selector,这里可以复制页面的选择器。

注:这里复制的选择器有坑,因为前端显示的html元素可能经过js代码和浏览器的修饰,所以可能调用soup.slect选择出来的内容是空列表,比如hdu用户信息的表格中无tbody

将元素选择出来后做成一个元组,并对元组中的rank进行非降序排序,然后利用dataframe保存到CSV文件中。

import requests
from bs4 import BeautifulSoup
import pandas as pd

class HDUOJ:

    def __init__(self):
        self.URL = 'http://acm.hdu.edu.cn/userstatus.php'
        self.userlist = ['successzjl23', 'nbbtxdy', 'zzp123456','yutudaoyao2','Liquor1201','wenyay123','hansiqi1','skyzo123','2274527696','qcydm1','huoyufei','housiqi','SE9MW35', 'jsdhwdmaX20wyk','czyorange','fificici0721','saber009',
                         '2020012124']
        self.namelist = ['周佳璐','杨顺昌','左泽平','宋怡诺','王婧磊','陈雅文','韩思琪','郭宇天','王欣雨','齐超元','郭泽坤','侯思琪','施景','王雨珂','程子蕴','袁彤菲','李元浩', '黄家豪']
        # 伪装请求头
        self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60'}

    def get_problem(self):
        l = []
        for i in range(len(self.namelist)):
            tmp = []
            html = requests.get(self.URL, params={'user': self.userlist[i]}, headers=self.header)
            soup = BeautifulSoup(html.text, "html.parser")
            name = soup.select('body > table >  tr:nth-child(6) > td > table >  tr > td > h1')
            rank = soup.select('body > table >  tr:nth-child(6) > td > table >  tr > td > table >  tr:nth-child(2) > td:nth-child(2)')
            Problems_Submitted = soup.select('body > table > tr:nth-child(6) > td > table >  tr > td > table >  tr:nth-child(3) > td:nth-child(2)')
            Problems_Solved = soup.select('body > table > tr:nth-child(6) > td > table >  tr > td > table >  tr:nth-child(4) > td:nth-child(2)')
            Submissions =soup.select('body > table > tr:nth-child(6) > td > table >  tr > td > table >  tr:nth-child(5) > td:nth-child(2)')
            Accepted = soup.select('body > table > tr:nth-child(6) > td > table >  tr > td > table >  tr:nth-child(6) > td:nth-child(2)')
            temp = self.userlist[i], self.namelist[i], int(rank[0].get_text()),Problems_Submitted[0].get_text(), Problems_Solved[0].get_text(), Submissions[0].get_text(), Accepted[0].get_text()
            l.append(temp)
        l.sort(key=lambda x: x[2])
        print(l)
        df = pd.DataFrame(l, columns=['user', 'name', 'rank', 'Problems_Submitted',
                                'Problems_Solved', 'Submissions', 'Accepted'])
        df.to_csv('d:\\problem.csv', encoding="utf_8_sig")
        print('done')


if __name__ == '__main__':
    cls = HDUOJ()
    cls.get_problem()



文章评论

目录