Python 有没有办法告诉selenium don';在某一点上不执行js?

Python 有没有办法告诉selenium don';在某一点上不执行js?,python,selenium,web-crawler,Python,Selenium,Web Crawler,我想抓取一个网站,其中有一些由js生成的内容。 该站点每5秒钟运行一次js更新内容(请求一个新的加密js文件,无法解析) 我的代码: from selenium import webdriver driver = webdriver.PhantomJS() driver.set_window_size(1120, 550) driver.get(url) trs = driver.find_elements_by_css_selector('.table tbody tr') print

我想抓取一个网站,其中有一些由js生成的内容。 该站点每5秒钟运行一次js更新内容(请求一个新的加密js文件,无法解析)

我的代码:

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)

driver.get(url)

trs = driver.find_elements_by_css_selector('.table tbody tr')

print len(trs)

for tr in trs:
    try:
        items.append(tr.text)
    except:
        # because the js update content, so this tr is missing
        pass

print len(items)
len(项目)
len(trs)
不匹配。 如何告诉selenium在我运行
trs=driver之后停止执行js或停止工作。通过\u css\u选择器('.table tbody tr')查找\u元素?

我以后需要使用
trs
,因此无法
driver.quit()

异常详细信息

---------------------------------------------------------------------------
StaleElementReferenceException            Traceback (most recent call last)
<ipython-input-84-b80e3579efca> in <module>()
     11 items = []
     12 for tr in trs:
---> 13     items.append(tr.text)
     14     #items.append(map_label(hidemyass_label, tr.find_elements_by_tag_name('td')))
     15 

C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.pyc in text(self)
     69     def text(self):
     70         """The text of the element."""
---> 71         return self._execute(Command.GET_ELEMENT_TEXT)['value']
     72 
     73     def click(self):

C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.pyc in _execute(self, command, params)
    452             params = {}
    453         params['id'] = self._id
--> 454         return self._parent.execute(command, params)
    455 
    456     def find_element(self, by=By.ID, value=None):

C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.pyc in execute(self, driver_command, params)
    199         response = self.command_executor.execute(driver_command, params)
    200         if response:
--> 201             self.error_handler.check_response(response)
    202             response['value'] = self._unwrap_value(
    203                 response.get('value', None))

C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.pyc in check_response(self, response)
    179         elif exception_class == UnexpectedAlertPresentException and 'alert' in value:
    180             raise exception_class(message, screen, stacktrace, value['alert'].get('text'))
--> 181         raise exception_class(message, screen, stacktrace)
    182 
    183     def _value_or_default(self, obj, key, default):

StaleElementReferenceException: Message: {"errorMessage":"Element is no longer attached to the DOM","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:63305","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"GET","url":"/text","urlParsed":{"anchor":"","query":"","file":"text","directory":"/","path":"/text","relative":"/text","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/text","queryKey":{},"chunks":["text"]},"urlOriginal":"/session/4bb16340-a3b6-11e5-8ce5-9d0be40203a6/element/%3Awdc%3A1450243990539/text"}}
Screenshot: available via screen
---------------------------------------------------------------------------
StaleElementReferenceException回溯(最后一次最近调用)
在()
11项=[]
12对于trs中的tr:
--->13项。追加(tr.text)
14#items.append(映射标签(hidemyas标签,tr.find元素,按标签名称('td'))
15
C:\Python27\lib\site packages\selenium\webdriver\remote\webelement.pyc文本(self)
69 def文本(自我):
70“元素的文本”
--->71返回self.\u执行(Command.GET\u元素\u文本)['value']
72
73 def单击(自身):
C:\Python27\lib\site packages\selenium\webdriver\remote\webelement.pyc in_execute(self、command、params)
452参数={}
453参数['id']=self.\u id
-->454返回self.\u parent.execute(命令,参数)
455
456 def find_元素(self,by=by.ID,value=None):
C:\Python27\lib\site packages\selenium\webdriver\remote\webdriver.pyc in execute(self,driver\u命令,参数)
199 response=self.command\u executor.execute(driver\u command,params)
200如果答复:
-->201自我错误处理程序检查响应(响应)
202响应['value']=self.\u展开值(
203响应。获取('值',无))
检查响应中的C:\Python27\lib\site packages\selenium\webdriver\remote\errorhandler.pyc(self,response)
179 elif exception_class==值中的UnexpectedAlertPresentException和“alert”:
180引发异常_类(消息、屏幕、堆栈跟踪、值['alert'].get('text'))
-->181引发异常_类(消息、屏幕、堆栈跟踪)
182
183定义值或默认值(self、obj、key、default):
StaleElementReferenceException:Message:{“errorMessage”:“元素不再附加到DOM”,“请求”:{“头”:{“接受”:“应用程序/json”,“接受编码”:“标识”,“连接”:“关闭”,“内容类型”:“应用程序/json;字符集=UTF-8”,“主机”:“127.0.0.1:63305”,“用户代理”:“Python urllib/2.7”},“httpVersion”:“1.1”,“方法”:“获取”,“url”:“/text”,“urlParsed”:“{”锚定“:”查询“:”文件“:”文本“,”目录“,”路径“:”文本“,”相对“:”文本“,”端口“,”主机“:”密码“,”用户“:”用户“,”用户信息“:”权限“:”协议“,”源“/”文本“,”查询“{}”,区块“:”:[”文本“,”urlOriginal“/”会话/4B16340-11e5-8ce5-9d0be40203a6/element/%3Awdc%3A1450243990539/text”}
屏幕截图:可通过屏幕
似乎tr不见了


PS:我需要使用selenium来选择元素。其他库,如
lxml
pyquery
不知道哪个元素是
display:none
或note,
.text()
经常会在
中得到评论或其他东西,等等错误。遗憾的是python没有一个完美的Jquery克隆。

使用scrapy。一旦确定页面已加载,请使用以下方法获取正文:

response = TextResponse(url=self.driver.current_url, body=self.driver.page_source, encoding='utf-8')

您现在有了页面的静态副本,因此可以使用scrapy的response.xpath提取所需的任何数据。这是更详细的信息。

您是否可以删除
try/except
-什么错误如果有的话,你得到了吗?@alecxe我已经粘贴了异常。@Mithril也许你可以尝试一次获得表格的全部文本,比如
。通过css选择器('.table tbody tr')查找表格元素.text
然后通过字符串操作存储tex。@Mesut Güneş我只是编写代码,例如,我需要在tr下操作一些td,for循环可能需要几秒钟,然后tr丢失…..scrapy只是一个爬虫框架,向scrapy添加selenium或splash支持对我的问题没有帮助。您的代码就像使用
lxml
要解析
driver.page\u source
,但
lxml
(我认为scrapy也在使用
lxml
)不知道哪个元素是
显示:无
(以及许多其他错误)。我需要使用selenium来选择元素。因此我要求作为标题。@Mithril一旦你有了静态副本,那么就没有JS每5秒更新一次。你有一个快照,这样即使for循环花费几秒钟,也不会有任何更改。你甚至可以保存
响应。body
并在第二天处理它。你不能将静态html传递给selenium.I需要使用selenium进行选择。@Mithril,我们可能会有不同的目的。我会使用
selenium
获取包含所有JS呈现内容的页面。按照我上面所述复制HTML,然后使用
scrapy
从静态HTML中提取我需要的信息。你是说有些原因不能使用
scrapy
关于?不,我已经提到,没有一个python包可以像jquery一样处理html。反Spider站点有很多随机垃圾dom元素来干扰提取真实内容。只有jquery(node.js)和selenium可以轻松提取真实内容。我不想浪费时间来打破反Spider规则。