力扣高校比赛分析--大佬是怎么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

爬虫分为两部分,第一部分爬下力扣的排名,链接在这里,很容易发现数据是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(
,).replace( ,))

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

    for j in h:
        lst.append(j.replace(
,).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(
,).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)

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

分析请见:

经验分享 程序员 微信小程序 职场和发展