力扣高校比赛分析--大佬是怎么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)
拿到数据后就可以进行分析一波了!
分析请见:
上一篇:
IDEA上Java项目控制台中文乱码