DrissionPage是我发现的一个很好替代selenium的第三方模块,根据作者介绍,他的创建是想把selenium和requests这两种不同方向的python包结合在一起,所以也就有的DrissionPage
个人使用下来确实很好用,摆脱了下载驱动烦恼,DrissionPage可以控制基于Chromium的浏览器。
个人通过DrissionPage很轻松就爬取到了boss数据,代码不超过40行,具体代码我忘放哪里的,待到日后,补上。
下面我分享一个我通过DrissionPage使用了案例(DrissionPage自带requests的功能,但是作者还没有掌握),这个网站第一页的数据很好拿,就只需要加上一个headers,就可以拿取到数据,但是我始终没有发现他翻页的逻辑,所以作者就通过DrissionPage来实现翻页这个。
下面是具体代码
from DrissionPage import ChromiumPage # 导入ChromiumPage类,用于网页操作
import csv # 导入csv模块,用于文件操作
# 定义函数append_to_csv,将数据行添加到指定的CSV文件
def append_to_csv(row, filename="天气.csv"):
with open(filename, mode='a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(row) # 写入一行数据
# 初始化ChromiumPage对象
page = ChromiumPage()
# 访问指定URL获取天气历史数据
page.get('https://tianqi.2345.com/wea_history/58259.htm')
# 定义函数fetch_and_save_weather_data,用于抓取和保存天气数据
def fetch_and_save_weather_data(name):
# 获取所有表格行元素
table_rows = page.eles("x:.//*[@class='history-table']//tr")
headers = table_rows[0].eles("x:.//th//text()")
append_to_csv(headers, f"{name}")
print(headers) # 打印表头数据(用于调试)
for row in table_rows[1:]: # 跳过表头,从第二行开始处理
# 获取当前行中所有单元格的文本
cell_texts = row.eles("x:.//td//text()")
print(cell_texts) # 打印获取到的数据(用于调试)
append_to_csv(cell_texts,f"{name}") # 将数据追加到CSV文件
# 点击“上一个月”按钮,加载前一个月的天气数据
page.ele("x:.//*[@class='history-btn']/a[@id='js_prevMonth']").click()
# 循环执行数据抓取和保存操作,共执行10次,循环次数越多,获取的数据越多,循环一次,就是获取一个月的数据
for i in range(1, 2):
fetch_and_save_weather_data(name=f"天气{i}.csv")
