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
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标记。好的……如果你觉得我的问题很好,并且已经被框架化好了,那么请考虑我的问题。非常感谢。