Selenium Python Instagram正在删除帖子中的所有图像不起作用

Selenium Python Instagram正在删除帖子中的所有图像不起作用,python,selenium,selenium-webdriver,selenium-chromedriver,screen-scraping,Python,Selenium,Selenium Webdriver,Selenium Chromedriver,Screen Scraping,我正在写一个小代码来下载帖子中的所有图像/视频。这是我的密码: import urllib.request as reqq from selenium import webdriver import time browser = webdriver.Chrome("D:\\Python_Files\\Programs\\chromedriver.exe") browser.get(url) browser.maximize_window() url_list = ['

我正在写一个小代码来下载帖子中的所有图像/视频。这是我的密码:

import urllib.request as reqq
from selenium import webdriver
import time

browser = webdriver.Chrome("D:\\Python_Files\\Programs\\chromedriver.exe")

browser.get(url)

browser.maximize_window()

url_list = ['https://www.instagram.com/p/CE9CZmsghan/']

img_urls = []
vid_urls = []
img_url = ""
vid_url = ""
    
for x in url_list:    
    count = 0   
    
    browser.get(x)
    
    while True:       
        
        try:
            elements = browser.find_elements_by_class_name('_6CZji')
            elements[0].click()
            time.sleep(1)
        except:
            count+=1
            time.sleep(1)
            if count == 2:
                break
        try:
            vid_url = browser.find_element_by_class_name('_5wCQW').find_element_by_tag_name('video').get_attribute('src')
            vid_urls.append(vid_url)
        except:
            img_url = browser.find_element_by_class_name('KL4Bh').find_element_by_tag_name('img').get_attribute('src')
            img_urls.append(img_url)

for x in range(len(img_urls)):
    reqq.urlretrieve(img_urls[x],f"D:\\instaimg"+str(x+1)+".jpg")
    
for x in range(len(vid_urls)):
    reqq.urlretrieve(vid_urls[x],"D:\\instavid"+str(x+1)+".mp4")

browser.close()

此代码提取文章中除最后一幅图像外的所有图像。依我看,这个准则是正确的。你知道为什么这段代码不提取最后一幅图像吗?任何帮助都将不胜感激。谢谢

转到示例中使用的URL,打开inspector,非常仔细地观察在图像之间单击时DOM是如何变化的。类为
KL4Bh
的页面元素有多个,因为它跟踪上一个图像、当前图像和下一个图像

这样做
find\u element\u by\u class\u name('KL4Bh')
将返回页面上的第一个匹配项

好的,让我们分解这个循环,看看发生了什么:

第一次迭代
页面打开
立即单击“下一步”查看第二张照片
从DOM中获取类“KL4Bh”的第一个元素
该类的第一个元素是第一个图像(现在是“上一个”图像)
[…2、3、4与1相同…]
第五次迭代
查找要单击的“下一步”按钮
找不到下一个按钮
`元素[0]`失败,索引错误
从DOM中获取类“KL4Bh”的第一个元素
该类的第一个元素仍然是第四个图像**
第六次迭代
查找要单击的“下一步”按钮
找不到下一个按钮
`元素[0]`失败,索引错误
错误计数超过阈值
出口回路
试着这样做:

    n = 0
    while True:
        try:
            elements = browser.find_elements_by_class_name('_6CZji')
            elements[0].click()
            time.sleep(1)
        except IndexError:
            n=1
            count+=1
            time.sleep(1)
            if count == 2:
                break
        try:
            vid_url = browser.find_elements_by_class_name('_5wCQW')[n].find_element_by_tag_name('video').get_attribute('src')
            vid_urls.append(vid_url)
        except:
            img_url = browser.find_elements_by_class_name('KL4Bh')[n].find_element_by_tag_name('img').get_attribute('src')
            img_urls.append(img_url)
它将执行与以前相同的操作,只是因为它现在使用
find\u elements\u by\u class
并索引到结果列表中,当它到达最后一个图像时,失败的按钮单击的索引错误也会导致图像查找增加它使用的索引。因此,它将在循环的最后一次迭代中使用第二个元素(当前图像)。 这段代码仍然存在一些严重的问题,但它确实修复了您看到的bug。一次解决一个问题:)

编辑 我认为以下几点可以改进此代码:

  • 当使用
    try except
    块捕获异常/错误时,应该始终遵循以下几条规则:
    • 指定要处理的特定异常和错误,不要使用非限定的
      除外。这样做的原因是,通过捕捉每一个可能的错误,我们实际上抑制并混淆了错误的来源。执行此操作的唯一合法原因是生成自定义错误消息,
      -块之外的最后一行应始终为
      提升
      ,以允许错误传播。这与我们通常对软件错误的看法相反,但在编写代码时,错误是你的朋友
    • try-except
      块也有问题,因为它们被用作条件控制结构。有时,这样编写代码似乎更容易,但这通常是对所使用的库的不完全理解的标志。我特别指的是检查视频和图像的块,尽管另一块也可以重构。通常,在执行条件分支时,使用
      if
      语句
  • 在selenium中使用
    sleep
    几乎总是不正确的,但这是新selenium用户最常见的陷阱。发生的情况是,开发人员在尝试搜索DOM时,将开始获得有关缺少元素的错误。他们将正确地得出结论,这是因为在selenium尝试读取页面之前,该页面在浏览器中没有完全加载。但是使用
    sleep
    不是正确的方法,因为仅仅等待一个固定的时间并不能保证页面将被完全加载。Selenium有一个内置机制来处理这个问题,称为(以及隐式等待和流畅等待)。使用显式等待将保证在允许代码继续之前页面元素是可见的

  • 嘿一吨泰铢!但是当我运行这段代码时,它给了我一个错误。因此,我尝试通过从
    行中删除
    索引器
    来运行它,结果它成功了!顺便说一句,你能指出我代码中的其他问题吗?还有一件事。当我在上一个img中监控
    img
    标记下的
    src
    属性时,
    src
    属性只包含上一个img的url,而不是上一个img的url。那么,当我尝试访问它时,它是否给了我最后一个img?了解那里发生了什么的最好方法是在循环开始之前添加一个断点,然后使用
    next
    单步执行每条语句。URL被存储在由代码> FordPyelEntsSyByCyrasyNAME]()/代码>返回的列表中,因此,'FiffyEntEnsSyBySub类名称('ABC')[n]将只占用第n个元素,所以它只具有1’IMG标记和1’SRC标记。好的……如果你觉得我的问题很好,并且已经被框架化好了,那么请考虑我的问题。非常感谢。