力扣高校比赛分析--大佬是怎么AC的(上)

四月份力扣的高校编程大赛,第一名的实力让人望尘莫及,力扣提供了排名,于是就想看看有没有有意思的东西在里面。First,把数据爬下来。

导入所需的头文件

import requests
from lxml import etree
from requests_html import HTMLSession
import json
import csv
import math
import time
import random
from faker import Factory

爬虫分为两部分,第一部分爬下力扣的排名,链接在这里https://leetcode-cn.com/contest/college/2019-spring/ranking/,很容易发现数据是json格式,找到json数据的链接,用json解析下来就可以了,以CSV格式存入。

user_50=[]
url="https://leetcode-cn.com/contest/api/contest_group/2019-spring/ranking/?pagination="
with open("rank.csv", 'a+', encoding='utf-8', newline='') as h:
    for i in range(1,35):
        res=requests.get(url+str(i))
        for j in res.json()['total_rank']:
            writer = csv.writer(h)
            writer.writerow((j['user_slug'],j['score'],int(j['rank'])+1+(i-1)*25,math.floor(j['total_time_used']),j['school_name']))
            user_50.append(j['user_slug'])

第二部分,我是把上面取到的用户名与url_name进行拼接,这样可以取到选手的主页,查看一些信息,放张图,取红框里的数据,我打了码,大致就这样。

 接下来就是写爬取规则了,之前一直没有尝试过requests_html库,今天用了一下,挺方便的,简单爬虫可以省去很多步骤。有两个点要注意一下,我买了代理,用的是阿布云的,即使这样也没有把信息全爬到,还有就是用了随机UA,之前我记的用过随机UA,但这次用发现一直报错,然后我查了一下自己装的库,是fake_useragent,是pypi版本的,Cpython解释器貌似不能用,也不清楚之前怎么用的,然后重新下载了faker包,这个是可以正常使用的。

session = HTMLSession()
url_name="https://leetcode-cn.com/"
fake = Factory().create('zh_CN')

# 代理服务器
proxyHost = "http-dyn.abuyun.com"
proxyPort = "9020"

# 代理隧道验证信息
proxyUser = "账号"
proxyPass = "密码"

proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
  "host" : proxyHost,
  "port" : proxyPort,
  "user" : proxyUser,
  "pass" : proxyPass,
}
proxies = {
    "http"  : proxyMeta,
    "https" : proxyMeta,
}

for i in user_50:
    
    url_res=url_name+i+'/'
    try:
        res = session.get(url_res,headers={'user-agent': fake.user_agent()},proxies=proxies)
    except requests.exceptions.ProxyError:
        time.sleep(2)
        continue
    
    lst=[url_res]

    #k和h是一些排名信息
    try:
        k=res.html.xpath('*//div[@class="col-sm-5 col-md-4"]/div[@class="panel panel-default"][2]/ul[@class="list-group"]/li[@class="list-group-item"]/span/text()')
        h=res.html.xpath('*//div[@class="col-sm-5 col-md-4"]/div[@class="panel panel-default"][3]/ul[@class="list-group"]/li[@class="list-group-item"]/span/text()')
    
    except etree.ParserError:
        continue

    for j in k:
        lst.append(j.replace('\n','').replace(' ',''))

    for j in range(3-len(k)):
        lst.append(' ')

    for j in h:
        lst.append(j.replace('\n','').replace(' ',''))
    

    #m是最近提交通过的语言
    try:
        m=res.html.xpath('*//div[@class="col-sm-7 col-md-8"]/div[@class="panel panel-default"][4]/ul[@class="list-group"]/a/span[@class="badge progress-bar-info"]/text()')
    except etree.ParserError:
        continue
    
    for w in m:
        lst.append(w.replace('\n','').replace(' ',''))

    with open("palyer.csv", 'a+', encoding='utf-8', newline='') as h:
        writer = csv.writer(h)
        writer.writerow(lst)
    
    time.sleep((random.randint(5,10))/20)

拿到数据后就可以进行分析一波了!

分析请见:https://blog.csdn.net/qq_40612211/article/details/89761616


版权声明:本文为qq_40612211原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。