我正在尝试编辑代码以 保存验证码 ,希望最终编写一个自动化机器人。以下 python 代码会导致随后的错误。
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
import urllib
import time
import os
path = "C:/Users/micha/Documents/PythonProgramming/IG"
gifname = "captcha"
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=chrome_options)
# Create url variable containing the webpage for a Google image search.
url = ("https://www.infamousgangsters.com/site.php?page=bulletfactory")
# Find the images.
imgResults = driver.find_elements(By.XPATH,"/html/body/div/table/tbody/tr/td/table/tbody/tr/td[2]/div[@class='spacer']/table[2]/tbody/tr/td[@class='bodymain']/div[2]/form/img/@src")
# Access and store the scr list of image url's.
src = []
for img in imgResults:
src.append(img.get_attribute('src'))
# Retrieve and download the images.
for i in range(len(src)): urllib.request.urlretrieve(str(src[i]),"sample_data/captchas{}.gif".format(i))
with open(os.path.join(path, gifname), 'wb') as f:
driver.close()
任何帮助或建议将不胜感激。
你的代码中出现的错误是因为
find_elements
方法预计 XPath 表达式应返回 WebElement 元素的集合,而你的表达式
//html/body/div/table/tbody/tr/td/table/tbody/tr/td[2]/div[@class='spacer']/table[2]/tbody/tr/td[@class='bodymain']/div[2]/form/img/@src
却被设计为提取
src
属性,而这实际上会返回一个字符串。
此外,你试图以错误的方式打开文件来保存验证码。你应该打开文件来保存每个单独的验证码图像,而不是打开一个文件(
captcha
)来写入所有验证码。
以下是更新后的代码,它应该能够正常工作:
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
import urllib
import time
import os
path = "C:/Users/micha/Documents/PythonProgramming/IG"
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=chrome_options)
# Create url variable containing the webpage for a Google image search.
url = ("https://www.infamousgangsters.com/site.php?page=bulletfactory")
driver.get(url)
# Find the images.
imgResult = driver.find_element(By.XPATH,"//html/body/div/table/tbody/tr/td/table/tbody/tr/td[2]/div[@class='spacer']/table[2]/tbody/tr/td[@class='bodymain']/div[2]/form/img")
# Access and store the scr list of image url's.
src = imgResult.get_attribute('src')
# Retrieve and download the images.
urllib.request.urlretrieve(str(src),"{}/captcha.gif".format(path))
driver.close()
此代码执行以下操作:
-
查找验证码图像:
它使用 XPath 表达式
//html/body/div/table/tbody/tr/td/table/tbody/tr/td[2]/div[@class='spacer']/table[2]/tbody/tr/td[@class='bodymain']/div[2]/form/img
查找验证码图像,然后使用find_element
(而不是find_elements
)来获取单个 WebElement。 -
获取图像的
src
属性: 它使用get_attribute('src')
获取图像 URL。 -
保存图像:
它使用
urllib.request.urlretrieve
保存图像。在这种情况下,它会将图像保存为captcha.gif
文件夹中path
。
注意: 此代码假设页面上只有一个验证码。如果有多个验证码,则需要更新代码以查找和保存所有验证码。
标签:python,selenium-webdriver,web-scraping,selenium-chromedriver From: 78794340