四月份力扣的高校编程大赛,第一名的实力让人望尘莫及,力扣提供了排名,于是就想看看有没有有意思的东西在里面。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版权协议,转载请附上原文出处链接和本声明。