python+selenium 知乎评论爬取

5 篇文章 0 订阅
3 篇文章 0 订阅
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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值