Selenium+requests出现窗口不能跳转的情况

用selenium+requests进行央视网新闻抓取的时候,会出现搜索页面无法跳转的情况。


爬虫设计的思路:

def search()#主要用来打开网页,并输入关键字进行搜索
def get_link_url()#定义抓取链接
def parse_html(link_url):#link_url是个列表,解析每一个链接得到的网页(requests.get())
def get_content(link):#link是个网址的列表,最后得到每一页的内容
def next_page():#定义翻页
def main()

爬虫在新闻搜索页面无法跳转:
可以通过:

driver.currunt_url()#driver=webdriver.Firefox()
In [203]: driver.current_url #还是之前的网址,并没有更新
Out[203]: 'http://www.cctv.com/'

In [204]: driver.current_window_handle#当前位置
Out[204]: '6442450945'

In [205]: driver.window_handles#共有多少个窗口
Out[205]: ['6442450945'] ['6442450949']

多了一个,说明搜索成功了,只是没有跳转.

通常可以通过以下方法解决:

 driver.forward()#表示前进
 driver.switch_to_window()#表示跳转
  • 本文主要采用后者来解决search()的跳转问题。代码如下:
driver = webdriver.Firefox()
wait = WebDriverWait(driver, 10)
  • 第一种:将关键字直接内置,但是对于多个更改关键字不方便.
def search():
    print('正在搜索')
    try:
        driver.get('http://www.cctv.com/')#初始网址
        input = wait.until(
            EC.presence_of_element_located((By.XPATH, '//span//input[@class="input_txt2"]')))
        input.clear()
        input.send_keys("互联网+")#输入关键字
        submit = wait.until(
            EC.element_to_be_clickable((By.XPATH, '//span//input[@type="button"]')))
        submit.click()
        driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
        #跳转到新的窗口
        if driver.current_window_handle==driver.window_handles[-1]:
            driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
            print("已经自己跳转到新窗口",driver.current_url)  
        else:
            driver.switch_to_window(driver.window_handles[-1])
            driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
            print("手工跳转",driver.current_url)
        return driver.current_url
    except TimeoutException:
        return search()

其中:

if driver.current_window_handle==driver.window_handles[-1]:
            driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')#向下滚动
            print("已经自己跳转到新窗口",driver.current_url)  
        else:
            driver.switch_to_window(driver.window_handles[-1])#认为最后一个就是搜索得到的窗口
            driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
            print("手工跳转",driver.current_url)`
   #  可以执行跳转,但是会出现switch_to_window的弃用警告(***暂时可以忽略***)。
  • 第二种 :将关键字作为搜索参数.
def search(name):#name为关键字
    print('正在搜索')
    try:
        driver.get('http://www.cctv.com/')
        input = wait.until(
            EC.presence_of_element_located((By.XPATH, '//span//input[@class="input_txt2"]')))
        input.clear()
        input.send_keys(name)
        submit = wait.until(
            EC.element_to_be_clickable((By.XPATH, '//span//input[@type="button"]')))
        submit.click()
        driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
        #跳转到新的窗口
        if driver.current_window_handle==driver.window_handles[-1]:
            driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
            print("已经自己跳转到新窗口",driver.current_url)  
        else:
            driver.switch_to_window(driver.window_handles[-1])
            driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')
            print("手工跳转",driver.current_url)
        return driver.current_url
    except TimeoutException:
        return search()

  • 所有的都执行完,发现这类不能自动跳转的,driver.close()并不能关闭所有的窗口,这里通过自定义函数实现:
#定义一个关浏览器的函数
def driver_close():
    for i in driver.window_handles:
        driver.switch_to_window(i)
        driver.close() 

欢迎进行爬虫交流

参考
崔庆才;课时1-3的代码

posted @ 2020-04-03 17:29  LgRun  阅读(572)  评论(0编辑  收藏  举报