爬虫selenium库的使用笔记——用selenium时,提示find. element. by_name()报错

在使用selenium爬虫时遇到AttributeError,提示'WebDriver' object has no attribute 'find_element_by_name'。解决方案包括:1) 更新selenium版本,使用By.NAME作为参数;2) 卸载并安装selenium的3.141.0版本。

一、报错内容:

在爬虫用selenium时,报错如下:AtteibuteError:'WebDriver' object has no attribute 'find_element_by name'

 代码如下:

import re
import requests
import pytesseract
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 获取手机号码及密码
phone = input('请输入手机号码:')
password = input('请输入密码:')
# 获取歌手名称
singer_name = input('请输入歌手名称:')

# 设置静默模式
opts = Options()
opts.headless = True

# 初始化谷歌浏览器驱动
driver = webdriver.Chrome(options=opts)
# 打开网页
driver.get('https://music.facode.cn/index.php/Home/Index/login.html')

# 定位到手机号码输入框的标签,并输入手机号码
user_tag = driver.find_element_by_name('phone')
user_tag.send_keys(phone)

二、解决方法

解决方法一:

查询资料说selenium更新了版本:要在开始引入from selenium. webdriver. common. by import By
具体用时改为find_element(By.NAME,""),代码如下:

from seleniue.webdriver.chrome.common.by import By
# user_tag = driver.find_element_by_name('phone')
# 修改为:
user_tag = driver.find_element(By.NAME,'phone')

解决方法二:

卸载原selenium库,打开win+R,输入cmd后输入 “pip uninstall selenium”,卸载完成后,下载3.141.0版本的selenium,输入“pip install selenium==3.141.0”即可。

二、环境

编辑器:Visual Studio Code

Python 3.10

浏览器:Google Chrome 107.0.5304.122(正式版本) (64 位)

import scrapy from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from scrapy import SeleniumRequest # Scrapy-Selenium 配置 SELENIUM_DRIVER_NAME = 'chrome' SELENIUM_DRIVER_EXECUTABLE_PATH = r"D:/ww/chromedriver/chromedriver.exe" # 替换为实际路径 SELENIUM_DRIVER_ARGUMENTS = ['--headless'] # 无头模式 DOWNLOADER_MIDDLEWARES = { 'scrapy_selenium.SeleniumMiddleware': 800, } class TaobaoItem: pass class TaobaoSpider(scrapy.Spider): name = 'taobao_spider' allowed_domains = ['taobao.com'] def start_requests(self): # 使用 Selenium 打开淘宝首页 yield SeleniumRequest( url="https://www.taobao.com", callback=self.parse, wait_time=10 ) def parse(self, response): driver = response.meta['driver'] # 在搜索框中输入关键词并提交 search_box = driver.find_element(By.ID, "q") search_box.send_keys("笔记本电脑") # 替换为需要搜索的商品 search_box.send_keys(Keys.RETURN) # 等待页面加载完成 driver.implicitly_wait(10) # 提取商品信息 items = driver.find_elements(By.CSS_SELECTOR, ".m-itemlist .item") for item in items: taobao_item = TaobaoItem() # 商品名称 product_name = item.find_element(By.CSS_SELECTOR, ".title").text taobao_item['product_name'] = product_name # 商品价格 price = item.find_element(By.CSS_SELECTOR, ".price").text taobao_item['price'] = price # 店铺名称 shop_name = item.find_element(By.CSS_SELECTOR, ".shop").text taobao_item['shop_name'] = shop_name # 销量 sales_volume = item.find_element(By.CSS_SELECTOR, ".deal-cnt").text taobao_item['sales_volume'] = sales_volume yield taobao_item # 处理分页 next_page = driver.find_elements(By.CSS_SELECTOR, ".pagination-next") if next_page and next_page[0].is_enabled(): next_page[0].click() driver.implicitly_wait(10) yield SeleniumRequest( url=driver.current_url, callback=self.parse, wait_time=10 )有问题
最新发布
06-12
### 调试和修复淘宝爬虫代码中的问题 在使用 Scrapy 和 Selenium 编写的淘宝爬虫中,可能会遇到多种问题,例如动态页面加载、反爬机制、元素定位失败等。以下是针对这些问题的详细分析和解决方案。 #### 1. 动态页面加载问题 淘宝的页面通常通过 JavaScript 动态加载内容,Scrapy 默认无法处理这种情况。Selenium 可以模拟浏览器行为并等待页面加载完成[^1]。如果发现某些元素未正确加载,可以尝试以下方法: - **显式等待**:使用 `WebDriverWait` 等待特定条件满足后再继续执行。 ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "q")) ) ``` - **调整等待间**:增加 `wait_time` 参数以确保页面完全加载[^3]。 #### 2. 元素定位失败 如果在代码中使用了错误的选择器或元素不存在,会导致定位失败。可以通过以下方式排查: - **检查选择器**:确保 CSS 或 XPath 选择器与目标页面结构匹配。可以使用浏览器开发者工具验证选择器是否正确[^2]。 ```python items = driver.find_elements(By.CSS_SELECTOR, ".m-itemlist .item") if not items: raise Exception("未能找到商品元素") ``` #### 3. 反爬机制 淘宝具有较强的反爬机制,可能导致 IP 被封禁或请求被拦截。以下是应对策略: - **设置请求头**:模拟真实用户行为,添加 User-Agent 和其他必要头信息。 ```python headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } ``` - **随机延迟**:在每次请求之间引入随机延迟以降低频率。 ```python import time import random time.sleep(random.uniform(1, 3)) ``` - **代理池**:使用代理 IP 池切换请求来源[^4]。 #### 4. 登录状态问题 如果需要抓取登录后的内容,可以使用 Selenium 模拟登录过程[^2]。 ```python # 输入用户名和密码 username_input = driver.find_element(By.ID, "username") password_input = driver.find_element(By.ID, "password") username_input.send_keys("your_username") password_input.send_keys("your_password") # 提交登录表单 login_button = driver.find_element(By.ID, "login-button") login_button.click() ``` #### 5. 数据存储问题 确保数据能够正确保存到目标文件中。可以使用 Scrapy 的内置导出功能或将数据写入数据。 ```python # 将数据保存为 JSON 文件 scrapy crawl taobao_spider -o taobao_data.json ``` #### 6. 错误日志分析 启用 Scrapy 的日志功能以捕获运行错误,并根据日志信息定位问题。 ```python # 在 settings.py 中配置日志 LOG_LEVEL = 'DEBUG' LOG_FILE = 'taobao_spider.log' ``` --- ### 示例代码片段 以下是一个改进后的爬虫代码片段,包含错误处理和优化措施: ```python import scrapy from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from scrapy_selenium import SeleniumRequest from ..items import TaobaoItem class TaobaoSpider(scrapy.Spider): name = 'taobao_spider' def start_requests(self): yield SeleniumRequest( url="https://www.taobao.com", callback=self.parse, wait_time=10 ) def parse(self, response): driver = response.meta['driver'] # 显式等待搜索框加载 search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "q")) ) search_box.send_keys("笔记本电脑") search_box.send_keys(Keys.RETURN) # 等待商品列表加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".m-itemlist .item")) ) items = driver.find_elements(By.CSS_SELECTOR, ".m-itemlist .item") for item in items: taobao_item = TaobaoItem() try: taobao_item['product_name'] = item.find_element(By.CSS_SELECTOR, ".title").text taobao_item['price'] = item.find_element(By.CSS_SELECTOR, ".price").text taobao_item['shop_name'] = item.find_element(By.CSS_SELECTOR, ".shop").text taobao_item['sales_volume'] = item.find_element(By.CSS_SELECTOR, ".deal-cnt").text except Exception as e: self.logger.error(f"解析商品失败: {e}") continue yield taobao_item # 处理分页 next_page = driver.find_elements(By.CSS_SELECTOR, ".pagination-next") if next_page and next_page[0].is_enabled(): next_page[0].click() yield SeleniumRequest( url=driver.current_url, callback=self.parse, wait_time=10 ) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值