Python反爬取访问验证处理

        最近爬取数据的时候,遇到反爬取限制:即当访问一定次数后会弹出访问验证如下图所示:

Python反爬取访问验证处理_第1张图片

Python反爬取访问验证处理_第2张图片 

 这种验证方式没找到绕过去的方法,那就只能用最笨的办法,弹出验证框后,将等待时间延长,然后手动点击验证。代码如下:

# 处理跳页
def jump_page(browser, pageNum):
    # 输入页码
    validate(browser, (By.ID, 'jpage'))
    browser.find_element(By.ID, 'jpage').clear()
    browser.find_element(By.ID, 'jpage').send_keys(pageNum)
    # 点击 go
    validate(browser,(By.XPATH, '//*[@id="jpage"]/following-sibling::input[1]'))
    browser.find_element(By.XPATH, value='//*[@id="jpage"]/following-sibling::input[1]').click()



def validate(browser,locator):
    captcha = None
    try:
        #找到验证框
        captcha = browser.find_element(By.ID, 'captcha')

    except NoSuchElementException as r:
        print("captcha:%s" % (r.msg))
        if captcha:
            # 如果验证框出现了,那就设置等待时间长一些好手动处理
            browser.implicitly_wait(30)
        else:
            browser.implicitly_wait(sleep_s)
    # 设置下一个操作事件的等待时间好手动点击验证(也可以去掉下面两行代码,加上后兼容性会更好一些,因为可能不止一种验证方式,而且要连续多次验证)
    wait = WebDriverWait(browser, 3600)
    wait.until(EC.presence_of_element_located(locator))

def t(pageNum):
    # 实例化chrome配置
    chrome_options = webdriver.ChromeOptions()

    # 设置浏览器默认下载路径
    ## profile.default_content_settings.popups:设置为 0 禁止弹出窗口
    ## download.default_directory:设置下载路径
    diy_prefs = {'profile.default_content_settings.popups': 0,
                 'download.default_directory': 'D:\Download\ChromeDownload'}

    # 添加路径到selenium配置中
    chrome_options.add_experimental_option('prefs', diy_prefs)

    # 实例化chrome浏览器时,添加配置信息
    browser = webdriver.Chrome(options=chrome_options)

    browser.maximize_window()
    browser.get("http://www.ucdrs.superlib.net/")

    # 点击登录
    browser.find_element(By.XPATH, value='// *[ @ id = "h_right"] / a[2]').click()
    # 输入用户名、密码
    browser.find_element(By.ID, 'userName').send_keys(u"188******")
    browser.find_element(By.ID, 'passWord').send_keys(u"z*******05!")
    browser.find_element(By.CLASS_NAME, 'submit').submit()
   
    # 点击书名分类
    # 由于验证框随时会弹出,所以在每个事件操作前都调一下
    validate(browser,(By.ID, 'slt1')) 
    browser.find_element(By.ID, 'slt1').click()
    # 输入关键词
    browser.find_element(By.ID, 'sw').send_keys(u"税")
    browser.find_element(By.NAME, 'Submit').submit()
    # 跳页处理,判断从哪一页开始
    if pageNum:
        jump_page(browser, pageNum)

    flag = True
    while flag:
        wait = WebDriverWait(browser, 3600)
        wait.until(EC.presence_of_element_located((By.ID, "jpage")))

        pageNum = browser.find_element(By.ID, 'jpage').get_attribute("value")

        print("--------当前页码:>" + pageNum + "<开始!------------")
        # 点击全选
        validate(browser,(By.ID, 'sltAll'))
        browser.find_element(By.ID, 'sltAll').click()

        # 点击导出
        validate(browser,(By.XPATH, '//*[@id="doaction"]/a/img'))
        browser.find_element(By.XPATH, value='//*[@id="doaction"]/a/img').click()
        # 点击 选择Excel方式
        validate(browser,(By.XPATH, '/html/body/div/table/tbody/tr/td[1]/ul/li[6]/label/input'))
        browser.find_element(By.XPATH, value='/html/body/div/table/tbody/tr/td[1]/ul/li[6]/label/input').click()
        # 点击输出到本地
        validate(browser,(By.CLASS_NAME, 'printBtn'))
        browser.find_element(By.CLASS_NAME, 'printBtn').click()
        print("--------当前页码:>" + pageNum + "<结束!------------")
        # validate(browser)

        browser.back()
        
        browser.back()
        
        browser.back()

        try:
            # 点击下一页
            validate(browser,(By.XPATH, '//*[@id="jpage"]/preceding-sibling::a[1]'))
            browser.find_element(By.XPATH, value='//*[@id="jpage"]/preceding-sibling::a[1]').click()
        except NoSuchElementException as r:
            print("-" * 15)
            print(r)
            print("=" * 15)
            #如果没有下一页了就退出循环
            flag = False

你可能感兴趣的:(Python,python,开发语言)