Python 有没有办法告诉selenium don';在某一点上不执行js?
我想抓取一个网站,其中有一些由js生成的内容。 该站点每5秒钟运行一次js更新内容(请求一个新的加密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
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规则。