1

我正在尝试编写一个脚本,它将我的数据从一个站点同步到另一个站点。第一个站点没有公共 api。但我知道这些查询,它可以为我提供我需要的所有数据的 json 响应。我决定使用selenium。主要问题是我必须获得授权才能获取这些数据,但是使用 selenium 授权太难了,因为站点使用 recaptcha2。我也想在我的服务器上使用它。所以我也使用pyvirtualdisplay

我在我的 Firefox 中创建了一个新的配置文件,然后我在第一个具有该配置文件的站点上获得了授权,并在脚本中使用了它。像这样的东西

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

profile = webdriver.FirefoxProfile('/home/admin/.cache/mozilla/firefox/o0eaxyux.user')
browser = webdriver.Firefox(profile, executable_path=r'./geckodriver')
browser.get("https://example.com/p/api/v5/profile/blabla")
response = json.loads(browser.find_element_by_tag_name('body').text)
print(response)

browser.quit()
display.stop()

它在我的电脑上完美运行。在服务器上,如果我不使用配置文件, pyvirtualdisplay也可以工作。但是,如果我在服务器上使用配置文件,则会收到错误消息:

Traceback (most recent call last):
  File "1.py", line 7, in <module>
    browser = webdriver.Firefox(profile, executable_path=r'./geckodriver')
  File "/home/admin/.local/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
    keep_alive=True)
  File "/home/admin/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/admin/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/admin/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/admin/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: connection refused

geckodriver.log 只有一个字符串:

1575543823086   mozrunner::runner   INFO    Running command: "/usr/bin/firefox" "-marionette" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofilegsEa0V"

有任何想法吗?

4

1 回答 1

1

问题是我从另一台电脑复制了 Firefox 配置文件。我不知道如何解决它。但我找到了另一个解决方案:使用 cookie 而不是配置文件:

  • 创建文件
import pickle
from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

profile = webdriver.FirefoxProfile('/home/admin/.cache/mozilla/firefox/o0eaxyux.user')
browser = webdriver.Firefox(profile, executable_path=r'./geckodriver')
browser.get("https://example.com/p/api/v5/profile/blabla")
pickle.dump(browser.get_cookies() , open("cookies.pkl","wb"))

browser.quit()
display.stop()
  • 用法
import pickle
from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

browser = webdriver.Firefox(profile, executable_path=r'./geckodriver')
browser.get("https://example.com/p/api/v5/profile/blabla")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    browser.add_cookie(cookie)
browser.get("https://example.com/p/api/v5/profile/blabla")
response = json.loads(browser.find_element_by_tag_name('body').text)
print(response)

browser.quit()
display.stop()

从这里开始:如何使用 Python + Selenium WebDriver 保存和加载 cookie

于 2019-12-07T08:55:16.700 回答