新手爬虫出现报错“ no such element: Unable to locate element ”

简介

来自一个自学爬虫的Python小白的经历:通过网络上的教学视频 ,模仿编程。由于视频资源比较老旧,技术更新较快,所以有些方面难以做到用视频教学代码成功运行 。此篇只记录产生的问题 ,包括已经解决和未解决的。再次申明,只是小白,只是简单的记录问题。

案例:斗鱼直播板块主播页面照片地址 ,所属标签 ,热度值,以及主播名字

初始代码如下:

from selenium import webdriver
import time

class DouyuSpider:
    def __init__(self):
        self.start_url = "https://www.douyu.com/directory/all"
        self.driver = webdriver.Chrome()

    def get_content_list(self):
        # 分组
        li_list = self.driver.find_elements_by_xpath("//ul[@class='588ea9-cc7ebb layout-Cover-list']/li")
        print(li_list)
        content_list = list()
        for li in li_list:
            item = {}

            item["room_img"] = li.find_element_by_xpath(".//div[@class='cc7ebb-0d1a65 LazyLoad is-visible DyImg DyListCover-pic']/img").get_attribute("src")
            # print("+"*50)
            item["room_title"] = li.find_element_by_xpath(".//div[@class='0d1a65-126960 DyListCover-userName']")
            # print("+"*50)
            item["room_cate"] = li.find_element_by_xpath(".//div[@class='126960-d1279e DyListCover-info']/span").text
            item["author_name"] = li.find_element_by_xpath(".//div[@class='d1279e-17ac3 DyListCover-info']/h3").text
            content_list.append(item)
            print(item)
        # 获取下一页
        next_url = self.driver.find_elements_by_xpath("//span[@class='17ac3-ahr0ch dy-Pagination-item-custom']")
        next_url = next_url[0] if len(next_url)>0 else None
        return content_list,next_url

    def save_content_list(self,content_list):
        # 略过
        pass

    def run(self):
        # 1.获取start_url
        # 2.发送请求,获取相应
        self.driver.get(self.start_url)
        # 3.提取数据	,获取下一页的url
        content_list, next_url = self.get_content_list()
        # 4.保存数据
        self.save_content_list(content_list)
        # 5.点击下一页,循环
        while next_url is not None:
            next_url.click()
            content_list, next_url = self.get_content_list()
            self.save_content_list(content_list)

if __name__ == "__main__":
    douyuspider =   DouyuSpider()
    douyuspider.run()

运行结果如下:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./div/a/div[1]/div[1]/img"}
  (Session info: chrome=88.0.4324.190)

根据百度得知,需要设定等待时间 。虽然在seleinum中会有设置等待时间的方法 ,具体不详。经试验可使用time模块的sleep方法,time.sleep(5),五秒左右测试即可。修改部分的代码如下:

    def run(self):
        # 1.获取start_url
        # 2.发送请求	,获取相应
        self.driver.get(self.start_url)

        time.sleep(5)
        # 3.提取数据,获取下一页的url
        content_list, next_url = self.get_content_list()
        # 4.保存数据
        self.save_content_list(content_list)
        # 5.点击下一页,循环
        while next_url is not None:
            next_url.click()
            time.sleep(5)
            content_list, next_url = self.get_content_list()
            self.save_content_list(content_list)

通过sleep方法经测试可以解决此问题 。
之后运行代码 ,出现此问题

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":".//div[@class='m6ly93-d3cuc2 LazyLoad is-visible DyImg DyListCover-pic']/img"}
  (Session info: chrome=88.0.4324.190)

修改部分代码如下:

item["room_img"] = li.find_element_by_xpath("./div/a/div[1]/div[1]/img").get_attribute("src")

具体错误:会在正常执行中报错 。错误问题是指:找不到对应的element对应的xpath为.//div[@class='d3cuc2-vvz3vy LazyLoad is-visible DyImg DyListCover-pic']/img。
解决方法: 注:此方法自我寻找,xpath之间的差异不详,欢迎大佬指教
在浏览器中复制对应的xpath ,可在xpath helper中实验提取对应的部分。例如上述对应的xpath为./div/a/div[1]/div[1]/img经过测验可以解决这个问题 。

  • 最后 ,再次声明来自一个Python小白的自学过程中出现的问题,及时交流与解决,如有不对地方 ,欢迎指教,不喜勿喷。

搬运请注明出处!!!

本文版权归趣快排www.sEoguruBlog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ✈61910465