最近爬取数据的时候,遇到反爬取限制:即当访问一定次数后会弹出访问验证如下图所示:
这种验证方式没找到绕过去的方法,那就只能用最笨的办法,弹出验证框后,将等待时间延长,然后手动点击验证。代码如下:
# 处理跳页
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