import re
import os
import pyperclip
import requests
from bs4 import BeautifulSoup
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.edge.service import Service
import time
from zhipuai import ZhipuAI
import pandas as pd
from tqdm import tqdm
from selenium.webdriver.common.action_chains import ActionChains
# 假设你已经有了一个Selenium WebDriver实例叫做driver
def get_text_from_glm4(txt):
client = ZhipuAI(api_key="0e7c3bdc04110b1a496de22d58c28b4a.mFNZ1HDlv9YbLCH6") # 填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4", # 填写需要调用的模型名称
messages=[
{
"role": "user", "content": "你好"},
{
"role": "assistant",
"content": "我是可以将任何的小说转为对话的人工智能助手,我可以回答任何问题,请描述问题:"},
{
"role": "user", "content": "问题如下:" + txt + "给出回答,或者解释"},
],
)
return response.choices[0].message
def get_aws():
# 如果 WebDriver 的路径没有被添加到系统的 PATH 环境变量中,需要指定它的路径
edge_driver_path = 'E:/sleep_lr/edgedriver_win64/msedgedriver.exe'
service = Service(edge_driver_path)
# # 创建 Edge 浏览器实例
driver = webdriver.Edge(service=service)
if not os.path.exists("cookies.pkl"):
driver.get("https://www.jianshu.com/")
input("ok")
pd.to_pickle(driver.get_cookies(), "cookies.pkl")
else:
driver.get("https://www.jianshu.com/")
driver.delete_all_cookies()
for cookie in pd.read_pickle("cookies.pkl"):
driver.add_cookie(cookie_dict=cookie)
#
# 打开一个网页
text_list=[]
for i in range(500):
one=driver.find_elements(By.XPATH,"//ul[@class='list']")[0].text
url_list=[ii.get_attribute("href") for ii in driver.find_elements(By.XPATH,"//ul[@class='list']/li/a[@class='avatar']")]
time.sleep(5)
# 创建一个ActionChains实例
actions = ActionChains(driver)
# 先悬浮再点击
actions.move_to_element(driver.find_elements(By.XPATH,"//div/a[@class='page-change']")[0]).click().perform()
text_list.append([one,url_list])
print(one)
pd.to_pickle(text_list,"jian_shu.pkl")
if __name__ == '__main__':
# print()
get_aws()
这段代码是一个使用 Python 语言编写的自动化脚本,目的是使用 Selenium WebDriver 来与网页交互并抓取数据。下面是代码的详细解析:
- 引入所需的库:
os
:用于与操作系统交互,例如检查文件是否存在。selenium.webdriver.common.by.By
:用于定位网页元素。selenium.webdriver
:包含 WebDriver 的接口。selenium.webdriver.edge.service.Service
:用于启动 Edge 浏览器服务。time
:用于暂停脚本执行。pandas as pd
:用于数据处理和分析,这里主要用于序列化(保存)和反序列化(加载)cookie。selenium.webdriver.common.action_chains.ActionChains
:用于模拟更复杂的用户操作,如鼠标悬停和点击。
- 定义
get_aws
函数:- 这个函数是脚本的主要部分,用于执行网页抓取操作。
- 设置 Edge WebDriver 的路径:
edge_driver_path
变量指定了 Edge WebDriver 可执行文件的路径。
- 启动 Edge 浏览器:
- 使用
Service
类和webdriver.Edge
来启动 Edge 浏览器。
- 使用
- 处理 cookies:
- 检查 “cookies.pkl” 文件是否存在。如果不存在,则访问简书网站,并在用户手动登录后保存 cookies。
- 如果 “cookies.pkl” 文件存在,则加载 cookies,以便在浏览器中保持登录状态。
- 抓取数据:
- 初始化一个空列表
text_list
用于存储抓取的数据。 - 使用一个
for
循环来迭代500次,每次迭代执行以下操作:- 抓取网页上特定元素(
//ul[@class='list']
)的文本。 - 获取一系列 URL(
//ul[@class='list']/li/a[@class='avatar']
)。 - 暂停5秒钟,以等待页面加载。
- 抓取网页上特定元素(
- 初始化一个空列表
- 执行页面导航操作:
- 创建一个
ActionChains
实例。 - 模拟鼠标悬停在下一个页面的链接上,并点击以导航到下一个页面。
- 创建一个
- 保存数据:
- 将抓取的文本和 URL 列表作为元素添加到
text_list
中。 - 打印当前页面的文本。
- 将
text_list
保存到 “jian_shu.pkl” 文件中。
- 将抓取的文本和 URL 列表作为元素添加到
- 主程序入口:
- 当该脚本作为主程序运行时,调用
get_aws()
函数。
请注意以下几点:
- 当该脚本作为主程序运行时,调用
range(500)
可能会导致大量的页面请求,这可能会触发简书网站的反爬虫机制。time.sleep(5)
是硬编码的等待时间,这可能导致脚本执行效率低下,并且可能不足以等待所有页面元素加载完成。- 该脚本没有异常处理机制,因此在网络问题或元素定位失败时可能会崩溃。
- 在实际使用中,
input("ok")
需要用户手动干预来继续执行脚本,这在自动化过程中是不理想的。 - 代码中可能存在一些逻辑问题,例如,循环中的
click().perform()
可能会在没有更多页面可点击时引发错误。