一天需要知道之前的一次区域赛的排名,之前比赛的榜没了,看到cf的gym里有榜,但是没有学校排名,就准备自己写一下爬虫试试。
然后就网上初步学习爬虫
大概思路
首先它页面估计都是动态生成的,所以不能直接用bs4获取源码,我是直接用selenium模拟访问,等到所有元素加载完成之后,用pagesource获取源码,然后用BeautifulSoup生成BeautifulSoup对象,在之后就一步一步获取元素(详情见代码)。
但总感觉自己实现比较麻烦,不知道有没有更好的方法或者多级标签 下的元素(有些元素没有id、class)
主要就是效率比较慢。
代码
# author : nofuck
# -*- codeing = utf-8 -*-
# @Time : 2020/11/19 10:59
# @Author : 李汶骏
# @Site :
# @File : run.py
# @Software : PyCharm
# -*- codeing = utf-8 -*-
from selenium import webdriver # 用来驱动浏览器
from selenium.webdriver import Chrome,ChromeOptions
from bs4 import BeautifulSoup
import re
def get(str):
ans = re.split(" ",str)
if ans[1][0]=='*' :
return None
return ans[1]
def run(url):
print("获取中...")
option = ChromeOptions()
option.headless = True
browser = webdriver.Chrome(options=option)
try:
browser.implicitly_wait(10)
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html,'lxml')
ret = soup.select('#pageContent .datatable .standings tr') # 队伍的信息的列表
id,rank = 0,1
vis = {'-1':1}
for i in ret:
id = id + 1
if (id==1) : continue;
par = BeautifulSoup(str(i),'lxml') #得到第i支队伍信息
ans = par.select('tr td') # 得到td里的信息
res = BeautifulSoup(str(ans[1]), 'lxml')
res1 = BeautifulSoup(str(res.select('span')),'lxml')
ans_str = get(res1.text)
if ans_str not in vis.keys() :
vis[ans_str] = rank
rank = rank + 1
while True:
name = input('输入要查找的学校排名:')
if name=='-1' :
break
print(name, ' ', vis[name])
finally:
browser.quit()
if __name__ == '__main__' :
run(input('输入要爬取的网页:'))