用selenium模块爬取同一个url下不同页的内容失败

问题遇到的现象和发生背景

用selenium模块爬取同一个url下不同页的内容失败

用代码块功能插入代码,请勿粘贴截图
from selenium import webdriver
import re
    
browser = webdriver.Chrome()  # 这里改成了有界面模式,方便调试代码
url = 'http://so.eastmoney.com/news/s?keyword=阿里巴巴' 

def dongfang(company):
    browser.get(url)
    data = browser.page_source

    browser.find_element("xpath",'//*[@id="app"]/div[3]/div[1]/div[5]/div/a[9]').click() #模拟翻页
    
    # print(data)  # 如果正则发生变化,可以通过打印源代码进行调试

    p_title = '
class="news_item_t" tracker-eventcode=".*?" tracker-extinfo="{.*?}">".*?" target="_blank">(.*?)' p_href = '
class="news_item_url" tracker-eventcode=".*?" tracker-extinfo="{.*?}">".*?" target="_blank">(.*?)
' p_date = '
class="news_item_c">class="news_item_time">(.*?) - ' title = re.findall(p_title, data) href = re.findall(p_href, data) date = re.findall(p_date, data, re.S) for i in range(len(title)): title[i] = re.sub('<.*?>', '', title[i]) date[i] = date[i].split(' ')[0] print(str(i+1) + '.' + title[i] + ' - '+ date[i]) print(href[i]) dongfang(3) # 可以通过它来调试,如果没问题,再通过下面的代码批量运行 browser.quit()
运行结果及报错内容

img

我想要达到的结果

想得到修改正确的代码

看上面显示的报错信息,都是根据xpath表达式,找不到相对应的页面元素,建议你可以先在浏览器上比如chrome安装一个xpath插件,然后再使用xpath表达式看是否能正常获取元素,然后再编写脚本程序。

两个错误:
1、点击翻页时候页面未加载完全就点击导致报错,所以时停几秒即可
2、正则表达式的获取标题和href有问题我给你改了下


import time

from selenium import webdriver
import re
browser = webdriver.Chrome()  # 这里改成了有界面模式,方便调试代码
url = 'http://so.eastmoney.com/news/s?keyword=阿里巴巴'
def dongfang(company):
    browser.get(url)
    data = browser.page_source
    time.sleep(5)
    browser.find_element("xpath", '//*[@id="app"]/div[3]/div[1]/div[5]/div/a[5]').click() #模拟翻页
    # print(data)  # 如果正则发生变化,可以通过打印源代码进行调试
    p_title = '<div class="news_item_t" tracker-eventcode="dfcfwss.ssh.ryq.nrdj" tracker-extinfo="{\'.*?\': 资讯,\'.*?\': \'.*?\'}"><a href=".*?" target="_blank">(.*?)</a>'
    p_href = '<div class="news_item_t" tracker-eventcode="dfcfwss.ssh.ryq.nrdj" tracker-extinfo="{\'.*?\': 资讯,\'.*?\': \'.*?\'}"><a href="(.*?)" target="_blank">.*?</a>'
    p_date = '<div class="news_item_c"><span class="news_item_time">(.*?) - '
    title = re.findall(p_title, data)
    href = re.findall(p_href, data)
    date = re.findall(p_date, data, re.S)
    for i in range(len(title)):
        title[i] = re.sub('<.*?>', '', title[i])
        date[i] = date[i].split(' ')[0]
        print(str(i+1) + '.' + title[i] + ' - '+ date[i])
        print(href[i])
dongfang(3)  # 可以通过它来调试,如果没问题,再通过下面的代码批量运行
browser.quit()

网页上的数据动态渲染有可能会慢,你需要sleep一下等加载完在去获取


import selenium
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Firefox() # Get local session of firefox
browser.get("http://news.sina.com.cn/c/2013-07-11/175827642839.shtml ") # Load page
time.sleep(5) # Let the page load
try:
    element = browser.find_element_by_xpath("//span[contains(@class,'f_red')]") # get element on page
    print element.text # get element text
except NoSuchElementException:
    assert 0, "can't find f_red"
browser.close()

常见解题思路和排查方向:
1.检查是不是元素可变(如动态id)【当引用switch_to_frame(id或name)时,需检查id或name值是否是动态变化的】
2.元素定位方式是不是有错误
3.页面重新渲染,变成旧的元素,再点击肯定会失败
常见场景:1)循环点击删除按钮、2)点击页面按钮,页面重新渲染(比如AngularJs)
4.页面嵌套了iframe【当元素定位不到时,需检查元素是否在iframe中】
5.页面可能切换到新的窗口
6.页面加载太慢,还没有加载出页面,就开始找元素 【对应页面上的元素还没加载完成,导致定位不到,需要设置等待时间】