selenium爬虫按钮点击疑问

qq_39736804 2019-04-17 02:39:52
使用Python的selenium模块抓取京东的一个页面,但是获取到节点后的click()方法没用,文本框输入ENTER也没用,由于节点没有id属性,不知道该怎么使用js,求助各位大神<a>标签按钮的点击究竟应该怎么写,具体代码如下

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

try:
browser=webdriver.Chrome()
wait=WebDriverWait(browser,10)
browser.get('https://search.jd.com/Search?keyword=ipad')
inpt=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage input')))
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > a')))
inpt.clear()
inpt.send_keys('2')
inpt.send_keys(Keys.ENTER)
time.sleep(5)
submit.click()
time.sleep(10)
except TimeoutException:
print 'failed'
...全文
290 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈年椰子 2019-04-22
  • 打赏
  • 举报
回复
引用 6 楼 qq_39736804 的回复:
谢谢您!真的非常感谢!我知道该怎么写了,也能实现网页的爬取,但是原理方面还是有点不懂,请问您可以留个联系方式么?我想请教一下您这个的原理。如果不方便的话就不强求了,这是我第一次用csdn,真的非常感谢!
qq 896894214
qq_39736804 2019-04-19
  • 打赏
  • 举报
回复
引用 5 楼 陈年椰子 的回复:
[quote=引用 4 楼 qq_39736804 的回复:]
[quote=引用 3 楼 陈年椰子 的回复:]
看起来是页面没移动到那个2 那里。 元素被隐藏了。
如果在 sleep 的时候, 滚动页面到 那排页面数字列表那里, 就工作, 感觉方向是找下移动滚动条的方法。

另外, 如果你是要找每个页面的数据, 可以试试发送右方向键的代码, 我看京东页面里有右方向键也可以翻页。

您好,针对您说的这个问题,我才用js的方式执行browser.execute_script('arguments[0].scrollIntoView();',submit),页面滚动到数字列表那里,然后再click(),结果还是在submit.click()处报错,控制台显示selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
我真的是不知道该怎么写了,请您再帮我看一下吧[/quote]

研究了一下, 发现出错在那个新语句,
browser.execute_script('arguments[0].scrollIntoView();', submit)
增加了 异常截取。能打开第2页。 只要找到正确的滚动方法, 应该就OK了。



try:
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get('https://search.jd.com/Search?keyword=ipad')
submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_bottomPage"]/span[1]/a[3]')))
try:
print('scroll')
browser.execute_script('arguments[0].scrollIntoView();', submit)
print('scroll ok')
except Exception as e1:
print('sroll fail')
print(repr(e1))
pass
time.sleep(2)
inpt = browser.find_element_by_xpath('//*[@id="J_bottomPage"]/span[1]/a[3]')
inpt.click()
time.sleep(2)
except Exception as e:
print 'failed'
print(repr(e))

[/quote]

谢谢您!真的非常感谢!我知道该怎么写了,也能实现网页的爬取,但是原理方面还是有点不懂,请问您可以留个联系方式么?我想请教一下您这个的原理。如果不方便的话就不强求了,这是我第一次用csdn,真的非常感谢!
陈年椰子 2019-04-19
  • 打赏
  • 举报
回复
引用 4 楼 qq_39736804 的回复:
[quote=引用 3 楼 陈年椰子 的回复:] 看起来是页面没移动到那个2 那里。 元素被隐藏了。 如果在 sleep 的时候, 滚动页面到 那排页面数字列表那里, 就工作, 感觉方向是找下移动滚动条的方法。 另外, 如果你是要找每个页面的数据, 可以试试发送右方向键的代码, 我看京东页面里有右方向键也可以翻页。
您好,针对您说的这个问题,我才用js的方式执行browser.execute_script('arguments[0].scrollIntoView();',submit),页面滚动到数字列表那里,然后再click(),结果还是在submit.click()处报错,控制台显示selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document 我真的是不知道该怎么写了,请您再帮我看一下吧[/quote] 研究了一下, 发现出错在那个新语句, browser.execute_script('arguments[0].scrollIntoView();', submit) 增加了 异常截取。能打开第2页。 只要找到正确的滚动方法, 应该就OK了。


try:
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser, 10)
    browser.get('https://search.jd.com/Search?keyword=ipad')
    submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_bottomPage"]/span[1]/a[3]')))
    try:
        print('scroll')
        browser.execute_script('arguments[0].scrollIntoView();', submit)
        print('scroll ok')
    except Exception as e1:
        print('sroll fail')
        print(repr(e1))
        pass
    time.sleep(2)
    inpt = browser.find_element_by_xpath('//*[@id="J_bottomPage"]/span[1]/a[3]')
    inpt.click()
    time.sleep(2)
except Exception as e:
    print 'failed'
    print(repr(e))

qq_39736804 2019-04-18
  • 打赏
  • 举报
回复
引用 3 楼 陈年椰子 的回复:
看起来是页面没移动到那个2 那里。 元素被隐藏了。
如果在 sleep 的时候, 滚动页面到 那排页面数字列表那里, 就工作, 感觉方向是找下移动滚动条的方法。

另外, 如果你是要找每个页面的数据, 可以试试发送右方向键的代码, 我看京东页面里有右方向键也可以翻页。

您好,针对您说的这个问题,我才用js的方式执行browser.execute_script('arguments[0].scrollIntoView();',submit),页面滚动到数字列表那里,然后再click(),结果还是在submit.click()处报错,控制台显示selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
我真的是不知道该怎么写了,请您再帮我看一下吧
陈年椰子 2019-04-18
  • 打赏
  • 举报
回复
看起来是页面没移动到那个2 那里。 元素被隐藏了。 如果在 sleep 的时候, 滚动页面到 那排页面数字列表那里, 就工作, 感觉方向是找下移动滚动条的方法。 另外, 如果你是要找每个页面的数据, 可以试试发送右方向键的代码, 我看京东页面里有右方向键也可以翻页。
qq_39736804 2019-04-18
  • 打赏
  • 举报
回复
引用 1 楼 陈年椰子 的回复:
一般是通过 find_element_by_xpath
或者 find_elements_by_class_name 定位 元素, 然后再调用 元素的click。

使用wait.until可以设置等待时间,在返回值和语法上都跟find_element_by的效果差不多,使用CSS选择器也可以提取到相应的节点,我还使用type和print测试了一下,确实是对应的节点,但是控制台反馈该节点没有找到对应的文档,所以click()一直不成功,我也不知道问题出在哪里,希望您能解答一下,谢谢!
陈年椰子 2019-04-17
  • 打赏
  • 举报
回复
一般是通过 find_element_by_xpath 或者 find_elements_by_class_name 定位 元素, 然后再调用 元素的click。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧