基于selenium的异步加载数据爬取——以中国大学排名为例
虽然我也不清楚为什么中国大学的排名还要用异步加载...难道是之前上课爬这玩意爬太多了大伙烦了...
from bs4 import BeautifulSoup
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 配置Chrome浏览器选项
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True) # 让浏览器在后台运行
# 定义URL
url = "https://www.shanghairanking.cn/rankings/bcur/2024"
# 初始化浏览器并访问URL
browser = webdriver.Chrome(options=option)
browser.get(url)
# 初始化列表来存储所有页面的数据
all_data = []
def getData():
global all_data # 使用全局变量来存储数据
html = browser.page_source # 获取当前页面的HTML
soup = BeautifulSoup(html, "html.parser")
tbody = soup.find('tbody') # 查找tbody元素
if tbody: # 确保tbody存在
for tr in tbody.find_all('tr'): # 查找所有的tr元素
if tr.find('td'): # 确保tr元素包含td元素
tds = tr.find_all('td') # 查找所有的td元素
# 提取文本并去除空格,然后将它们添加到all_data列表中
all_data.append([td.get_text(strip=True) for td in tds])
# 爬取数据的函数
def crawl_pages(max_pages):
current_page = 1 # 当前页码初始化为1
while current_page <= max_pages: # 循环爬取指定数量的页面
getData() # 获取当前页面的数据
time.sleep(3) # 等待3秒
# 检查是否有下一页按钮,并点击它(如果有的话)
try:
next_page = browser.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next>a')
next_page.click()
current_page += 1 # 成功点击后,增加当前页码
except:
break # 如果没有下一页按钮,则跳出循环
# 爬取20页数据
crawl_pages(20)
# 将数据存储到txt文件
def write_to_txt(data, filename='中国大学排名.txt'):
with open(filename, 'w', encoding='utf-8') as f:
headers = ["排名", "学校名称", "省市", "类型", "总分"] # 根据实际网页内容调整表头
f.write('\t'.join(headers) + '\n') # 写入表头
for row in data:
f.write('\t'.join(row) + '\n') # 写入每一行数据
# 调用函数将数据写入txt文件
write_to_txt(all_data)
# 关闭浏览器
browser.quit()
更新:三代,生成excel,去掉了大学名称中的多余字符,并加了筛选特定学校功能
import pandas as pd
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 用户输入检索的大学名称
search_value = input('请输入您想检索的大学名称: ')
# 初始化列表来存储所有页面的数据
all_data = []
# 配置Chrome浏览器选项
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True) # 让浏览器在后台运行
# 定义URL
url = "https://www.shanghairanking.cn/rankings/bcur/2024"
# 初始化浏览器并访问URL
browser = webdriver.Chrome(options=option)
browser.get(url)
def getData(page=1):
global all_data # 使用全局变量来存储数据
html = browser.page_source # 获取当前页面的HTML
soup = BeautifulSoup(html, "html.parser")
tbody = soup.find('tbody') # 查找tbody元素
if tbody: # 确保tbody存在
for tr in tbody.find_all('tr'): # 查找所有的tr元素
if tr.find('td'): # 确保tr元素包含td元素
tds = tr.find_all('td') # 查找所有的td元素
# 提取每个学校的排名、名称、省市、类型、总分和办学层次
ranking = tds[0].get_text(strip=True)
name = tds[1].find(class_="name-cn").get_text(strip=True)
province = tds[2].get_text(strip=True)
category = tds[3].get_text(strip=True)
score = tds[4].get_text(strip=True)
level = tds[5].get_text(strip=True)
# 添加到数据列表中
all_data.append([ranking, name, province, category, score, level])
def crawl_pages(max_pages):
current_page = 1 # 当前页码初始化为1
while current_page <= max_pages: # 循环爬取指定数量的页面
getData() # 获取当前页面的数据
try:
next_page = browser.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next>a')
next_page.click()
current_page += 1 # 成功点击后,增加当前页码
except:
break # 如果没有下一页按钮,则跳出循环
# 爬取20页数据
crawl_pages(20)
# 将数据存入DataFrame
df = pd.DataFrame(all_data, columns=["排名", "学校名称", "省市", "类型", "总分", "办学层次"])
# 将数据写入Excel文件
excel_filename = "中国大学完整排名.xlsx"
df.to_excel(excel_filename, index=False)
# 检索包含输入名称的行
search_df = df[df['学校名称'].str.contains(search_value)]
# 如果存在符合条件的数据,则将其写入新的Sheet中
if not search_df.empty:
search_sheet_name = search_value + "排名"
with pd.ExcelWriter(excel_filename, mode='a', engine='openpyxl') as writer:
search_df.to_excel(writer, sheet_name=search_sheet_name, index=False)
print(f'包含"{search_value}"的数据已写入Excel中的"{search_sheet_name}"工作表。')
else:
print(f'未找到包含"{search_value}"的数据。')
# 关闭浏览器
browser.quit()
版权声明:
作者:夜阑
链接:http://yelan.xyz/index.php/2024/04/26/%e5%9f%ba%e4%ba%8eselenium%e7%9a%84%e5%bc%82%e6%ad%a5%e5%8a%a0%e8%bd%bd%e6%95%b0%e6%8d%ae%e7%88%ac%e5%8f%96-%e4%bb%a5%e4%b8%ad%e5%9b%bd%e5%a4%a7%e5%ad%a6%e6%8e%92%e5%90%8d%e4%b8%ba/
来源:夜阑的小站
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
共有 0 条评论