• 【WEB自动化】Selenium爬取用户的知乎回答时遇到10002:请求参数异常,请升级客户端后重试


    这里分享一个低配版知乎爬虫,利用了Selenium模块

    爬取的过程中遇到了10002:请求参数异常,请升级客户端后重试,调用知乎某用户的回答API返回的HTTP状态码是403 Forbidden

    之后找了一篇博客,里面给出的解决方案是:使用自己打开的一个浏览器,再用selenium接管这个浏览器这样就可以完成反爬的处理。

    步骤

    1

    cmd切换到chrome.exe所在的目录下,
    (文件资源管理器内,到指定目录下,在地址栏输入cmd回车也行)

    执行命令chrome.exe --remote-debugging-port=9222 --user-data-dir="E:selenium_data"

    其中--remote-debugging-port是建立新的移植位置,其中端口后面会使用(自定义), --user-data-dir是数据存储的目录(自定义)

    2

    运行py代码爬取某用户的回答

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    import requests
    from selenium.webdriver.common.keys import Keys
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    
    
    
    def load_photo(url, name):
        '''给定图片链接,将图片以某个名称下载到本地'''
        # url = 'http://img14.360buyimg.com/n1/s450x450_jfs/t1/148801/37/12770/118749/5f9d71e4E39f1e893/533675187c108953.jpg'
        reponse = requests.get(url)
        # name = 'd:/photo.jpg'
        with open(name, 'wb') as ft:
            ft.write(reponse.content)
    
    def drop_scroll(browser):
        '''将滑条从头滚动到底,以便让浏览器充分加载'''
        for x in range(1, 11, 2):
            # time.sleep(0.5)
            j = x/10
            js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
            browser.execute_script(js)
    
    def switch_window(browser):
        '''将browser的指令移到新打开的小窗口处'''
        # time.sleep(0.5) # 如果移转失败,请增大这个时间
        windows = browser.window_handles
        browser.switch_to.window(windows[-1])
    
    def switch_window_back(browser):
        '''将browser的指令移回旧的小窗口'''
        windows = browser.window_handles
        browser.switch_to.window(windows[0])
    
    
    # 构造网址
    u_id= input('请输入https://www.zhihu.com/people/{u_id}中的u_id')
    url = f'https://www.zhihu.com/people/{u_id}'
    page = int(input("要遍历的页数(从第一页开始)"))
    
    # 打开知乎
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")  #  前面设置的端口号
    browser = webdriver.Chrome(options=chrome_options)
    
    # browser.set_window_size(900, 500) # 设置窗口大小
    # browser.set_window_position(300, 200) # 设置浏览器的位置
    browser.get(url)
    btn=browser.find_element_by_xpath("//button[@aria-label='关闭']")
    browser.execute_script("arguments[0].click();", btn)
    time.sleep(2)
    
    # 遍历页面中每篇回答
    count = 1 # 回答的编号
    for page_id in range(1,page+1):
        # 翻页
        print("Page:%d" %page_id)
        url = f'https://www.zhihu.com/people/{u_id}/answers/by_votes/?page={page_id}'
        browser.get(url)
        time.sleep(2)
        btn = browser.find_element_by_xpath("//button[@aria-label='关闭']")
        browser.execute_script("arguments[0].click();", btn)
        time.sleep(2)
        switch_window_back(browser)  # 将browser的指令移回到新标签页
        drop_scroll(browser)     #滑条拖到底,让加载完全
        answers = browser.find_elements_by_xpath("//div[@class='ContentItem AnswerItem']")  # 获取所有回答
        for answer in answers:
            print(answer.find_element_by_xpath(".//a[@data-za-detail-view-element_name='Title']").get_attribute('href')
                  , answer.find_element_by_xpath(".//a[@data-za-detail-view-element_name='Title']").text
                  , answer.find_element_by_xpath(".//button[@class='Button VoteButton VoteButton--up']").text
                  , sep=' , ')
            print(count)
            count=count+1
    
    
    
    

    一个注意的点是webdriver.Chrome()是可以传入参数的,
    executable_path传入的值得当的话不必把chromedriver.exe设在$PATH里


    //以上图片来自这个网站

    像极了一名爬虫新手的课程作业。。。

    爬取了85页之后被知乎检测到了。。。

  • 相关阅读:
    使用Docfx生成项目文档
    代码性能优化-----减少数据库读取次数
    代码性能优化-----前端页面异步实现
    代码性能优化——task
    SVN批处理
    性能优化
    provider 设计模式
    【IObit】五大软件激活码( Advanced Systemcare....)
    关于 facebook
    关于 Google 与 Chrome
  • 原文地址:https://www.cnblogs.com/yhm138/p/14791984.html
Copyright © 2020-2023  润新知