from selenium import webdriver # 从selenium导入webdriver
from selenium.webdriver.common.by import By # 内置定位器策略集
from selenium.webdriver.support.wait import WebDriverWait # 用于实例化一个Driver的显式等待
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome() # chrome_options=option 这个参数设置之后可以隐藏浏览器
driver.get('https://www.zhihu.com/question/22110581') #修改这里的地址
file = open("./messages.txt", "w")
# file.truncate() #清空文件
def waitFun():
js = """
let equalNum = 0;
window.checkBottom = false;
window.height = 0;
window.intervalId = setInterval(()=>{
let currentHeight = document.body.scrollHeight;
if(currentHeight === window.height){
equalNum++;
if(equalNum === 2){
clearInterval(window.intervalId);
window.checkBottom = true;
}
}else{
window.height = currentHeight;
window.scrollTo(0,window.height);
window.scrollTo(0,window.height-1000);
}
},1500)"""
# 这个暂停一下是因为要等待页面将下面的内容加载出,这个 1500 可以根据自己的网络快慢进行适当的调节
# 这里需要往上移动一下,因为不往上移动一下发现不会加载。
driver.execute_script(js)
# selenium 可以获取 浏览器中 js 的变量。调用的js return
def getHeight(nice):
# 这里获取 js 中的 checkBottom 变量,作为到底部时进行停止。
js = """
return window.checkBottom;
"""
return driver.execute_script(js)
try:
# driver.maximize_window() # 窗口最大化
# 先触发登陆弹窗。
WebDriverWait(driver, 40, 1).until(EC.presence_of_all_elements_located(
(By.CLASS_NAME, 'Modal-backdrop')), waitFun())
# 点击空白关闭登陆窗口
ActionChains(driver).move_by_offset(200, 100).click().perform()
# 当滚动到底部时
WebDriverWait(driver, 40, 3).until(getHeight, waitFun())
# 获取回答
answerElementArr = driver.find_elements_by_css_selector('.RichContent-inner')
for answer in answerElementArr:
file.write('==================================================================================')
file.write('\n')
file.write(answer.text)
file.write('\n')
print('成功爬取 '+ str(len(answerElementArr)) +' 条,已存入到 message.txt 文件内')
finally:
driver.close() #close the driver
python+selenium 知乎评论爬取
最新推荐文章于 2023-07-03 19:03:01 发布