python - 在过渡到 Ubuntu 的过程中,如何修复 chromedriver Windows >>> 的可执行错误?

标签 python linux selenium selenium-webdriver exe

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

Blockquote selenium.common.exceptions.WebDriverException: >> Message: 'chromedriver' executable needs to be in the PATH.

windows exe 文件在 PATH 中并与 windows 一起工作。我已将 chromedriver 替换为最新版本的 Linux chromedriver,并将 chrome 网络浏览器安装到默认目录。它似乎没有意识到该文件在那里,并且在代码中没有指定它是它正在寻找的 .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。 更新*** 正如 Yosuva A 所建议的。我在 chromedriver 的文件目录中使用 chmod +x 使文件可执行(如果它还没有)然后我双击该文件以查看它是否可以执行,收到此错误消息

could not display "chromedriver".

there is no application installed for "shared library" files. do you want to search for an application to open this file?

文件类型是:共享库(application/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 supports Chrome version 78

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

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

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

Blockquote selenium.common.exceptions.WebDriverException: >> Message: 'chromedriver' executable needs to be in the PATH.

更新#5:在运行 scrapy 爬行期间显示命令提示符。

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 与列为旧目录的行一起使用后,我发现所有其他代码行都更改了它们并且可以正常工作。

最佳答案

让 chromedriver 工作主要有三件事:

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

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

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

关于python - 在过渡到 Ubuntu 的过程中,如何修复 chromedriver Windows >>> 的可执行错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273834/

相关文章:

python - gdata-python-api + 带有简单例份验证的分析

python - pygame 中的连续对象创建?

Linux进程如何将数据从父进程传递给子进程

linux - [向量] 在 smap 中是什么意思?

java - Selenium 3 InternetExplorer 驱动程序设置

python - 从查询集中获取相关对象,保留顺序

python - optparse() : Input validation

Linux通知脚本

python - 使用 BS4 或 Selenium 从 finishline.com 抓取网页

javascript - 如何在 Python 中使用 Selenium 获取 JavaScript 元素?