简单粗暴彻底解决selenium+chromedriver无法定位各种元素的方法

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/u011521609/article/details/56852697

等等等!客官不要心急,等全部加载出来了就完全是你的了

经过近一周时间终于搞定了,由于ajax网页内部非常复杂,导致爬虫爬取的时候如果网页内部一些元素尚未完全出现会出现各种webdriver.find_element定位不准的问题,并且由于不同的浏览器工作细节并不完全相同,导致使用chromedriver能定位的phantomjs不行,反之亦然,这方面是常常遇到的,看看github上coder们的困惑:

Phantomjs cannot find element where chrome and firefox can

发生问题多种,比如无法找到,无法定位到,有遮罩等,其实问题就是一个,网页还没有完全加载完毕,下面的解答:

Python selenium —— 一定要会用selenium的等待,三种等待方式解读

关于selenium 的应用,这个博客下面还有很多相关文章不错推荐学习。

下面是我的代码,一个技术小白只追求能弄出来的代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #导入模拟点击
import re
import codecs
from time import sleep  #导入等待 无比重要的等待


browser = webdriver.Chrome()  #mac系统的话chromedriver()放到 usr/local/bin/ 下面就可以 不需要禁用sip
browser.get('https://www.你的网址')
elem = browser.find_element_by_class_name("J-search-input")
sleep(5)
elem.send_keys(u'搜索框输入中文')
elem.send_keys(Keys.RETURN)
sleep(5)
browser.find_element_by_partial_link_text("你要点击的").click() #用phantomjs返回找不到,应该也是网页没有完全加载完成导致的
print (browser.current_url)
htmlstart = browser.page_source
digurl = re.findall(r'''data-hippo-type="shop" title=(.*?)>''',htmlstart,re.S)
i=0
for each in digurl:
    i +=1
    print (each)

for j in range(0, 2):
    browser.find_element_by_partial_link_text('下一页').click()
    browser.implicitly_wait(100)  #隐式等待100秒,对于我这个数据爱好者来说,这个时间完全可以等
    print(browser.current_url)
    htmlloop = browser.page_source
    digurlloop = re.findall(r'''data-hippo-type="shop" title=(.*?)>''',htmlloop,re.S)
    k = 0
    for each in digurlloop:
        k += 1
        print (each)

browser.quit() #这点比phantomjs好,因为chrome自动退出就知道运行完成了。

#上面的时间等待如果可以就直接爬到第50页,如果被拦截,就可以点击到第10页,第20页这样

summary:

open Chrome, Firefox or phantomjs and sleep for 1 minute to wait for all html loaded. 

昨日运行代码,明明可以点击,今日又定位不到元素了,原因应该是网页打开之后一个活动推广图片盖住元素,但是等待再久也没用,于是换了phantomjs解决了,还是不去研究网页自己怎么加载的,只要网页一改 也还要改代码,如果等待也还是解决不了的话,就是更换driver,driver其实很多,东方不亮西方亮




猜你喜欢

转载自blog.csdn.net/u011521609/article/details/56852697