首页 > 解决方案 > 在过渡到 Ubuntu 时,如何使用 chromedriver Windows >>> 修复可执行错误?

问题描述

我的目标是执行我以前在 Windows 上使用过的脚本,转换到 chromedriver 并且出现此错误:

Blockquote selenium.common.exceptions.WebDriverException:>> 消息:“chromedriver”可执行文件需要在 PATH 中。

windows exe 文件位于 PATH 中并适用于 windows。我已经用最新版本的 Linux chromedriver 替换了该 chromedriver,已将 chrome web 浏览器安装到默认目录。它似乎无法识别该文件在那里,并且在代码中没有指定它是它正在寻找的 .exe。

这是代码

import scrapy
from ..items import AuctionscrapingItem
from selenium.webdriver.support.ui import 
WebDriverWait
from selenium.webdriver.support import 
expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import 
TimeoutException
from selenium.common.exceptions import 
NoSuchElementException
from scrapy.crawler import CrawlerProcess
import time
import re
from twisted.internet import reactor, defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.settings import Settings
from auctionscraping import settings as my_settings
import mysql.connector
from datetime import datetime

class AuctionInt(scrapy.Spider):
    name = 'auction'
    start_urls = ['https://www.websitefunfirst.com/']


    def __init__(self):
        self.driver = webdriver.Chrome('/opt/lampp/htdocs/scrapy/chromedriver')
        self.driver.maximize_window()
        self.conn = mysql.connector.connect(
            host= 'localhost',
            user= 'root',
            passwd= '',
            database= 'auction'
        )

        self.curr = self.conn.cursor(buffered=True)
        self.curr.execute("""create table IF NOT EXISTS auction_tb(
            id int,
            web_name text,
            website text,
            name text,
            start text,
            end text,
            locations text,
            location_link text,
            remaining_time text,
            current_bid text,
            viewer text,
            premium text,
            image_urls text,
            bid text,
            starting_bid text,
            description text
        )""")
        self.curr.execute("""create table IF NOT EXISTS bid_history(
            id int NOT NULL,
            name varchar(50),
            bidder varchar(20) NOT NULL,
            bid_amount text,
            PRIMARY KEY (id,name,bidder)
        )""")
        try:
            self.curr.execute("""select id from auction_tb order by id desc limit 1""")
            last_id = self.curr.fetchone()
            self.id_no = last_id[0]
        except:
            self.id_no = 0
        f = open("/opt/lampp/htdocs/scrapy/result.txt", "w")
        f.write("scraping")
        f.close()
        self.clear_ended_item() 
         '''

在代码中,我更改了驱动程序目录以匹配 ubuntu(将 xampp 更改为 lampp 和之前的目录),并且我为网站抓取添加了一个占位符。这部分脚本和整个脚本完美地在 Windows 上运行。我尝试过的事情:

  1. 用等效的 linux 文件替换 .exe 文件。
  2. 加载计算机的wine以在调用时执行.exe。关于那个的一些事情......安装wine后我右键单击可执行文件以用wine打开它,wine不是可用的选项,也没有可用的计算机搜索它。
  3. 我已经从这里看到并尝试了 linux 服务器选项How to implement chromedriver in selenium in Linux platform
  4. 在这个页面向下滚动 3/4,他们用 Javascript 编写了一些显然适用于 java 的东西。这里我不确定如何以类似的方式编辑我的 python 代码。https://tecadmin.net/setup-selenium-chromedriver-on-ubuntu/
  5. 我更改了路径并进行了研究,但主要是我认为这里的问题是我不知道如何更改我的代码以使其适用于 linux。UPDATE*** 正如 Yosuva A 所建议的那样。我在 chromedriver 上的文件目录中使用 chmod +x 来使文件可执行(如果它尚未执行)然后我双击该文件以查看它是否会执行,收到此错误消息

无法显示“chromedriver”。

没有为“共享库”文件安装应用程序。你想搜索一个应用程序来打开这个文件吗?

文件类型是:共享库(应用程序/x-sharedlib)现在在属性中检查了允许执行

更新#2:正如 Yosuva A 所建议的那样。我使用了来自 chromedriver (chromedriver.chromium.org/getting-started) 的示例脚本并得到了一个不同的错误,但这清楚地表明它正在查找 chromedriver 文件。

selenium.common.exceptions.SessionNotCreatedException: Message: session not >created: This version of ChromeDriver only support Chrome version 78

我正在寻找一种方法来查找我拥有的 chrome 并下载 chromdriver 以匹配它。另一种方法是下载 chrome 版本 78。它会引发与以前不同的错误

更新 #3:示例 chrome 脚本现在可以工作,尝试与原始脚本文件相同的编码行

更新#4(10 分钟后):示例脚本有效。项目脚本运行失败 - 获取错误信息

Blockquote selenium.common.exceptions.WebDriverException:>> 消息:“chromedriver”可执行文件需要在 PATH 中。

update#5:在运行scrapy crawl期间显示命令提示符。

2019-10-10 00:28:29 [py.warnings] WARNING: 

/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/spiderloader.py:37: UserWarning: There are several spiders with the same name:

      Furgeson named 'auction' (in auctionscraping.spiders.auction_spyder)
      Hemingway named 'auction' (in auctionscraping.spiders.auction_spyder)
      Jeffersons named 'auction' (in auctionscraping.spiders.auction_spyder)
      End named 'auction' (in auctionscraping.spiders.auction_spyder)

      This can cause unexpected behavior.
      warnings.warn(msg, UserWarning)

    2019-10-10 00:28:29 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'auctionscraping', 'NEWSPIDER_MODULE': 'auctionscraping.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['auctionscraping.spiders']}
    2019-10-10 00:28:29 [scrapy.extensions.telnet] INFO: Telnet Password: cef133d6b6822838
    2019-10-10 00:28:29 [scrapy.middleware] INFO: Enabled extensions:
    ['scrapy.extensions.corestats.CoreStats',
     'scrapy.extensions.telnet.TelnetConsole',
     'scrapy.extensions.memusage.MemoryUsage',
     'scrapy.extensions.logstats.LogStats']



 Note: error message comes up after the script has failed to run.. when i CTRL + C close the program this error:

> File "/home/disco/.conda/envs/success/bin/scrapy", line 11, in <module>
    sys.exit(execute())
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/cmdline.py", line 149, in execute
    cmd.crawler_process = CrawlerProcess(settings)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 251, in __init__
    super(CrawlerProcess, self).__init__(settings)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 137, in __init__
    self.spider_loader = _get_spider_loader(settings)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 338, in _get_spider_loader
    return loader_cls.from_settings(settings.frozencopy())
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/spiderloader.py", line 61, in from_settings
    return cls(settings)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/spiderloader.py", line 25, in __init__
    self._load_all_spiders()
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/spiderloader.py", line 47, in _load_all_spiders
    for module in walk_modules(name):
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/utils/misc.py", line 71, in walk_modules
    submod = import_module(fullpath)
  File "/home/disco/.conda/envs/success/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/opt/lampp/htdocs/scrapy/auctionscraping/auctionscraping/spiders/auction_spyder.py", line 576, in <module>
    f = open("opt/lampp/htdocs/scrapy/result.txt", "w")
FileNotFoundError: [Errno 2] No such file or directory: 'opt/lampp/htdocs/scrapy/result.txt'
Unhandled error in Deferred:
2019-10-10 00:44:07 [twisted] CRITICAL: Unhandled error in Deferred:

>Traceback (most recent call last):
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 172, in crawl
    return self._crawl(crawler, *args, **kwargs)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 176, in _crawl
    d = crawler.crawl(*args, **kwargs)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/twisted/internet/defer.py", line 1613, in unwindGenerator
    return _cancellableInlineCallbacks(gen)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
    _inlineCallbacks(None, g, status)
--- <exception caught here> ---
  File "/opt/lampp/htdocs/scrapy/auctionscraping/auctionscraping/spiders/auction_spyder.py", line 571, in crawl
    yield runner.crawl(Jefferson)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    result = g.send(result)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 79, in crawl
    self.spider = self._create_spider(*args, **kwargs)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/crawler.py", line 102, in _create_spider
    return self.spidercls.from_crawler(self, *args, **kwargs)
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/scrapy/spiders/__init__.py", line 51, in from_crawler
    spider = cls(*args, **kwargs)
  File "/opt/lampp/htdocs/scrapy/auctionscraping/auctionscraping/spiders/auction_spyder.py", line 408, in __init__
    self.driver = webdriver.Chrome('opt/lampp/htdocs/scrapy/chromedriver')
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
    self.service.start()
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/selenium/webdriver/common/service.py", line 83, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
2019-10-10 00:44:07 [twisted] CRITICAL: 
Traceback (most recent call last):
  File "/home/disco/.conda/envs/success/lib/python3.7/site-packages/selenium/webdriver/common/service.py", line 76, in start
    stdin=PIPE)
  File "/home/disco/.conda/envs/success/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/home/disco/.conda/envs/success/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'opt/lampp/htdocs/scrapy/chromedriver': 'opt/lampp/htdocs/scrapy/chromedriver'

更新#6:我看到 .txt 文件有一个错误,我已经更改了该文件的位置并将其重定向到脚本中。我接下来为 chromedriver 文件执行此操作。

更新#7:chromedriver 的位置应该是 /opt/lampp...,但它被错误地标记为 opt/lampp.. -- 更改后浏览器打开,但脚本没有运行。普通的空白页。

现在我认为 chromedriver 问题已经解决,这主要是一个目录不便,因为该目录在文件中多次列出,最初我只看到脚本中标记 chromedriver 目录的一行。在将 ctrl +F 与列为旧目录的行一起使用后,我发现所有其他代码行都更改了它们并且它可以工作。

标签: pythonlinuxseleniumselenium-webdriverexe

解决方案


让 chromedriver 工作主要有三件事:

  1. 将所有旧目录更改为 chromedriver 到新目录,使用 CTRL + F 对文本文件进行全局搜索。这样做的重要部分是当我收到 chromedriver 错误时,它没有显示它在哪一行打印错误,因此在旧目录再次调用 chromedriver 时,它在更改到新目录时被忽略但提示仍然显示找不到 chromedriver 文件,另外 2 次 chromedriver 被调用,该目录被设置为旧目录——抛出同样的错误。

  2. Mchromedriver 版本与 chrome 版本相同。这是在任何其他外部错误中发现的,在从 chromedriver 教程页面运行示例脚本时,使用程序 chromedriver 文件位置检查文件是否在使用干净脚本(教程 chromedriver 脚本)时无法找到。

  3. 为您现在使用的任何操作系统下载 chromedriver 并将文件标记为可执行文件,安装在任何目录中,只需确保在执行时更改目录。


推荐阅读