概率论_数理统计 2024-04-15 22:45 采纳率: 0%
浏览 35
已结题

爬知乎登录之后内容加载不出来

img


def pa():  # 爬取动态下滑加载网页
    options = webdriver.ChromeOptions()
    options.binary_location = r"D:\Program Files\Google\Chrome\Application\chrome.exe"
    options.add_argument('--disable-infobars') #去掉chrome正受到自动测试软件的控制的提示
    options.add_argument('--disable-gpu') # 这个参数可以规避谷歌的部分bug
    options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0')
    
    driver = webdriver.Chrome()
    driver.get("https://www.zhihu.com/")
    driver.maximize_window()
    time.sleep(30)
    
    #键盘操作
    keyboard = driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/header/div[1]/div[1]/div/form/div/div/label/input')
    # 定位输入框并输入文本
    keyboard.send_keys('西安旅游')
    # 模拟回车键进行跳转(输入内容后) 
    keyboard.send_keys(Keys.ENTER)
    time.sleep(3)
    
    #鼠标操作筛选:只看文章
    shaixuan1 = driver.find_element(By.XPATH,'/html/body/div[1]/div/main/div/div[1]/div/div/div')
    # 对定位到的元素执行点击操作
    ActionChains(driver).click(shaixuan1).perform()
    shaixuan2 = driver.find_element(By.XPATH,'/html/body/div[1]/div/main/div/div[1]/div[2]/ul[1]/li[3]/div')
    ActionChains(driver).click(shaixuan2).perform()
    time.sleep(3)
    
    
    js = '''
                let height = 0
        let interval = setInterval(() => {
            window.scrollTo({
                top: height,
                behavior: "smooth"
            });
            height += 500
        }, 500);
        setTimeout(() => {
            clearInterval(interval)
        }, 7000);
    '''
    driver.execute_script(js)
    time.sleep(30)
    
    #用到了beautifulSoup库解析HTML
    bs = BeautifulSoup(driver.page_source, "html.parser")
    driver.close()

    #beautifulSoup摘取HTML数据
#     list = bs.select(".goods-item__title")
#     for i in range(len(list)):
#         list[i] = list[i].get_text()
#         print("%s\n" % list[i])


想爬取知乎的文章,所有工作都做完了,网页能滚动,能爬动态加载的内容,但是发现第一步不行,进入知乎之后加载不出来内容

先是进入知乎,time.sleep一会去登录,然后搜索问题,之后再跳转到下一个界面就加载不出来,这是被反爬了吗,怎么解决呢

如果单开一个网页操作就没问题,用Python自动化操作就不行!

  • 写回答

23条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-15 22:45
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    针对您遇到的爬取知乎登录后内容加载不出来的问题,首先确认一下是否是由于反爬机制导致的。通常情况下,登录失败、加载内容不全可能与以下几点有关:

    1. Cookies和Session管理:确保在登录过程中正确处理Cookies和Session信息,以便在后续请求中保持登录状态。

    2. User-Agent伪装:虽然您已经在ChromeOptions中设置了User-Agent,但有时可能需要定期更换以避免被识别为爬虫。

    3. 滑动加载与Ajax请求:知乎的内容通常通过Ajax异步加载,可能需要监听并模拟这些请求来获取更多内容。

    4. IP限制与代理:频繁访问可能导致IP被临时封禁,使用代理IP可以缓解这一问题。

    针对您的代码,我提供以下优化建议及解决方案:

    优化建议:

    1. 显式指定ChromeDriver路径:在webdriver.Chrome()中添加ChromeDriver路径,例如webdriver.Chrome(executable_path='path/to/your/chromedriver')

    2. 增加登录逻辑:您提到需要先登录,但代码中并未体现。请确保在爬取前成功完成登录过程,并妥善处理Cookies和Session。

    3. 更新User-Agent:考虑使用第三方库(如fake_useragent)生成随机User-Agent,降低被识别为爬虫的风险。

    4. 处理Ajax加载内容:使用Selenium的WebDriverWait配合expected_conditions动态等待Ajax加载完成,或监听网络请求,直接获取异步加载的数据。

    解决方案:

    以下是基于您现有代码进行优化后的示例,包括登录逻辑、处理Ajax加载内容以及更新User-Agent。由于涉及具体账号密码,此处仅展示登录流程的大致结构,您需根据实际情况填写相应信息。

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import fake_useragent
    from bs4 import BeautifulSoup
    import time
    
    def login_zhihu(username, password):
        # 使用fake_useragent生成随机User-Agent
        ua = fake_useragent.UserAgent()
        user_agent = ua.random
        
        options = Options()
        options.binary_location = r"D:\Program Files\Google\Chrome\Application\chrome.exe"
        options.add_argument('--disable-infobars')
        options.add_argument('--disable-gpu')
        options.add_argument(f'User-Agent={user_agent}')
    
        driver = webdriver.Chrome(executable_path='path/to/your/chromedriver', options=options)
        driver.get("https://www.zhihu.com/signin")
    
        # 填写登录信息(请替换为实际账号密码)
        username_input = driver.find_element(By.NAME, 'username')
        username_input.send_keys(username)
    
        password_input = driver.find_element(By.NAME, 'password')
        password_input.send_keys(password)
    
        login_button = driver.find_element(By.CLASS_NAME, 'sign-button')
        login_button.click()
    
        # 等待登录完成(可根据实际页面结构调整预期条件)
        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'zu-main-content')))
        
        return driver
    
    def pa(driver):
        driver.get("https://www.zhihu.com/")
        driver.maximize_window()
        time.sleep(3)
    
        # 键盘操作(搜索“西安旅游”并回车)
        search_input = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/header/div[1]/div[1]/div/form/div/div/label/input')
        search_input.send_keys('西安旅游')
        search_input.send_keys(Keys.ENTER)
        time.sleep(3)
    
        # 鼠标操作筛选:只看文章
        shaixuan1 = driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[1]/div/div/div')
        ActionChains(driver).click(shaixuan1).perform()
        shaixuan2 = driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[1]/div[2]/ul[1]/li[3]/div')
        ActionChains(driver).click(shaixuan2).perform()
        time.sleep(3)
    
        # 处理Ajax加载内容(此处以等待特定元素出现为例,实际可能需要监听网络请求)
        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'QuestionItem-title')))
    
        # 获取页面源码并关闭浏览器
        bs = BeautifulSoup(driver.page_source, "html.parser")
        driver.quit()
    
        # 解析HTML数据(此处仅为示例,根据实际需求调整)
        questions = bs.select('.QuestionItem-title')
        for question in questions:
            print(question.text)
    
    # 调用登录函数并开始爬取
    driver = login_zhihu('your_username', 'your_password')
    pa(driver)
    

    请根据上述优化建议和解决方案调整您的代码,并注意遵守知乎的爬虫政策,避免过于频繁地访问。如果问题依然存在,可能需要进一步分析网络请求、检查浏览器开发者工具中的错误日志,或者尝试使用代理IP等方法。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 创建了问题 4月15日