用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 = '' 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()
想得到修改正确的代码
看上面显示的报错信息,都是根据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.页面加载太慢,还没有加载出页面,就开始找元素 【对应页面上的元素还没加载完成,导致定位不到,需要设置等待时间】