Scrapyd не будет развертывать Spider-проект, содержащий модуль селена, на мой локальный хост - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь развернуть моего scrapy-spider на локальном хосте с помощью scrapyd. Скрипт spider содержит модуль selenium для выполнения некоторых веб-автоматизированных задач.проблема возникает, когда я пытаюсь развернуть его.

После запуска scrapyd из командной строки для запуска локального хоста.Я набираю локальный адрес хоста в своем браузере, и он подключается к Интернету и прослушиваетЗатем введите команду scrapyd-deploy в другом окне cmd, и она застрянет вот так на несколько часов (без сообщения об ошибке).

$ scrapyd-deploy local
Packing version 1560251984
Deploying to project "crawler" in http://localhost:6800/addversion.json

описание застрявшего образа

Между прочим, я использую gitbash на своей машине с Windows, я также пытался использовать обычный cmd, но это все тот же бесконечный режим ожидания и задержки.

В первом окне cmd, где я запускаю команду scrapyd дляоткройте локальный хост, я получаю что-то вроде этого.

DevTools listening on ws://127.0.0.1:9137/devtools/browser/07f179fa-02ce-4b31-a5
96-9b700654f105

devtools слушает застрявшее изображение

Насколько я понимаю, это браузер селена в безголовом режиме пытаетсячтобы инициировать, но он продолжает ждать бесконечно.

Когда я открываю каталог своего проекта, я вижу новые папки, такие как яйца, информация о проекте и яйца и сборка.Кажется, что он запускает проект, но запускается с задержкой при попытке развернуть и запустить его на локальном хосте.

это мой скрипт паука

import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait as Webwait
from selenium.webdriver.support import expected_conditions as exco
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import random

C_options = Options()
C_options.add_argument("--disable-extensions")
C_options.add_argument("--disable-gpu")
C_options.add_argument("--headless")

class CloupAppSpider(scrapy.Spider):
    driver = webdriver.Chrome(options=C_options,
                              executable_path=r"C:\.....\chromedriver.exe")
    driver.get("https://scrapingclub.com/exercise/basic_login/")
    cookie = driver.get_cookies()
    driver.add_cookie(cookie[0])
    name = 'crawl'
    allowed_domains = ['scrapingclub.com']
    start_urls = ['https://scrapingclub.com/exercise/basic_login/']

    def __int__(self, name=None, passwd=None, *args, **kwargs):
        super(CloupAppSpider, self).__init__(*args, **kwargs)
        self.passwd = passwd
        self.name = name

    def parse(self, response):
        pword = self.passwd
        uname = self.name
        Webwait(self.driver, 10).until(exco.presence_of_element_located((By.ID, "id_name")))
        Webwait(self.driver, 10).until(exco.presence_of_element_located((By.ID, "id_password")))
        CloupAppSpider.driver.find_element_by_id("id_name").send_keys(pword)
        CloupAppSpider.driver.find_element_by_id("id_password").send_keys(uname)
        CloupAppSpider.driver.find_element_by_css_selector(".btn.btn-primary").click()
        Webwait(self.driver, 10).until(exco.presence_of_element_located((By.CLASS_NAME, "col-lg-8")))
        html = CloupAppSpider.driver.execute_script("return document.documentElement.outerHTML")
        bs_obj = BeautifulSoup(html, "html.parser")
        text = bs_obj.find("div", {"class": "col-lg-8"}).find("p")
        obj = text.get_text()
        obj = obj + str(random.randint(0, 100))
        self.driver.close()
        yield{
            'text': obj
        }

Это мой контент scrapy.cfg

[settings]
default = crawler.settings
[deploy:local]
url = http://localhost:6800/
project = crawler

Может ли кто-нибудь помочь мне объяснить, где я ошибся, я не знаю, так как я не получил никакого кода ошибки при развертывании.он просто продолжает бесконечно ждать, я думаю, когда он пытается обработать селеном.

1 Ответ

0 голосов
/ 14 июня 2019

Я решил это. Моя ошибка заключалась в том, что я инициировал процесс селена в основном классе пауков, а не в функции def parse, содержащейся в классе пауков. Я только что отредактировал код следующим образом.

import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait as Webwait
from selenium.webdriver.support import expected_conditions as exco
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import random

C_options = Options()
C_options.add_argument("--disable-extensions")
C_options.add_argument("--disable-gpu")
C_options.add_argument("--headless")

class CloupAppSpider(scrapy.Spider):

    name = 'crawl'
    allowed_domains = ['scrapingclub.com']
    start_urls = ['https://scrapingclub.com/exercise/basic_login/']

    def __int__(self, name=None, passwd=None, *args, **kwargs):
        super(CloupAppSpider, self).__init__(*args, **kwargs)
        self.passwd = passwd
        self.name = name

    def parse(self, response):
        driver = webdriver.Chrome(options=C_options,                                  
         executable_path=r"C:\......\chromedriver.exe")
        driver.get("https://scrapingclub.com/exercise/basic_login/")
        cookie = driver.get_cookies()
        driver.add_cookie(cookie[0])
        pword = self.passwd
        uname = self.name
        Webwait(self.driver, 10).until(exco.presence_of_element_located((By.ID, "id_name")))
        Webwait(self.driver, 10).until(exco.presence_of_element_located((By.ID, "id_password")))
        CloupAppSpider.driver.find_element_by_id("id_name").send_keys(pword)
        CloupAppSpider.driver.find_element_by_id("id_password").send_keys(uname)
        CloupAppSpider.driver.find_element_by_css_selector(".btn.btn-primary").click()
        Webwait(self.driver, 10).until(exco.presence_of_element_located((By.CLASS_NAME, "col-lg-8")))
        html = CloupAppSpider.driver.execute_script("return document.documentElement.outerHTML")
        bs_obj = BeautifulSoup(html, "html.parser")
        text = bs_obj.find("div", {"class": "col-lg-8"}).find("p")
        obj = text.get_text()
        obj = obj + str(random.randint(0, 100))
        self.driver.close()
        yield{
            'text': obj
        }
...