Невозможно правильно обработать сценарий локально созданного ответа сервера - PullRequest
6 голосов
/ 17 мая 2019

Я использовал скрипт для локального запуска селена, чтобы я мог использовать ответ (полученный из селена) внутри моего паука.

Это веб-сервис, где селен работает локально:

from flask import Flask, request, make_response
from flask_restful import Resource, Api
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

app = Flask(__name__)
api = Api(app)

class Selenium(Resource):
    _driver = None

    @staticmethod
    def getDriver():
        if not Selenium._driver:
            chrome_options = Options()
            chrome_options.add_argument("--headless")

            Selenium._driver = webdriver.Chrome(options=chrome_options)
        return Selenium._driver

    @property
    def driver(self):
        return Selenium.getDriver()

    def get(self):
        url = str(request.args['url'])

        self.driver.get(url)

        return make_response(self.driver.page_source)

api.add_resource(Selenium, '/')

if __name__ == '__main__':
    app.run(debug=True)

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

import scrapy
from urllib.parse import quote
from scrapy.crawler import CrawlerProcess

class StackSpider(scrapy.Spider):
    name = 'stackoverflow'
    url = 'https://stackoverflow.com/questions/tagged/web-scraping?sort=newest&pageSize=50'
    base = 'https://stackoverflow.com'

    def start_requests(self):
        link = 'http://127.0.0.1:5000/?url={}'.format(quote(self.url))
        yield scrapy.Request(link,callback=self.parse)

    def parse(self, response):
        for item in response.css(".summary .question-hyperlink::attr(href)").getall():
            nlink = self.base + item
            link = 'http://127.0.0.1:5000/?url={}'.format(quote(nlink))
            yield scrapy.Request(link,callback=self.parse_info,dont_filter=True)

    def parse_info(self, response):
        item = response.css('h1[itemprop="name"] > a::text').get()
        yield {"title":item}

if __name__ == '__main__':
    c = CrawlerProcess()
    c.crawl(StackSpider)
    c.start()

Проблема в том, что приведенный выше скрипт дает мне один и тот же заголовок несколько раз, затем другой заголовок и т. Д.

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

1 Ответ

4 голосов
/ 25 мая 2019

Я запустил оба сценария, и они запускаются как задумано.Итак, мои выводы:

  1. downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError нет средств, чтобы пройти через эту ошибку без разрешения сервера, здесь, например, ebay.
  2. Журналы от scrapy:

    2019-05-25 07:28:41 [scrapy.statscollectors] ИНФОРМАЦИЯ: Дамп статистики Scrapy: {'downloader / exception_count': 72, 'downloader / exception_type_count / twisted.internet.error.ConnectionRefusedError': 64,'downloader / exception_type_count / twisted.web._newclient.ResponseNeverReceived': 8, 'downloader / request_bytes': 55523, 'downloader / request_count': 81, 'downloader / request_method_count / GET': 81, 'загрузчик / response4866tes''downloader / response_count': 9, 'downloader / response_status_count / 200': 9, 'finish_reason': 'shutdown', 'finish_time': datetime.datetime (2019, 5, 25, 1, 58, 41, 234183), 'item_scraped_count ': 8,' log_count / DEBUG ': 90,' log_count / INFO ': 9,' request_depth_max ': 1,' response_received_count ': 9,' retry / count ': 72,' retry / reason_count / twisted.internet.error.ConnectionRefusedError ': 64,' retry / reason_count / twisted.web._newclient.ResponseNeverReceived ': 8,' scheduler / dequeued ': 81,' scheduler / dequeued / memory ': 81,' scheduler / enqueued ': 131,' scheduler / enqueued / memory ': 131,'start_time ': datetime.datetime (2019, 5, 25, 1, 56, 57, 751009)} 2019-05-25 07:28:41 [scrapy.core.engine] ИНФОРМАЦИЯ: Паук закрыт (отключение)

Вы можете видеть только 8 элементы в соскобе.Это просто логотипы и прочие неограниченные вещи.

Server Log:

s: //.ebaystatic.com http://.ebay.com https://*.ebay.com". Либо ключевое слово unsafe-inline, хеш ('sha256-40GZDfucnPVwbvI /Q1ivGUuJtX8krq8jy3tWNrA / n58 = ') или одноразовый номер (' nonce -... ') требуется для включения встроенного выполнения.", источник: https://vi.vipr.ebaydesc.com/ws/eBayISAPI.dll?ViewItemDescV4&item=323815597324&t=0&tid=10&category=169291&seller=wardrobe-ltd&excSoj=1&excTrk=1&lsite=0&ittenable=false&domain=ebay.com&descgauge=1&cspheader=1&oneClk=1&secureDesc=1 (1)

Ebay не позволяет вам утилизировать себя.

Итак, как выполнить вашу задачу >>

  1. Каждый раз перед проверкой проверяйте /robots.txt для того же сайта. Для ebay: http://www.ebay.com/robots.txt И вы можете видеть, что почти все запрещено.

    User-agent: * Disallow: / * rt = nc Disallow: / b / LH_ Disallow: / brw / Disallow: / clp / Disallow: / clt / store / Disallow: / csc / Disallow: / ctg / Disallow: / ctm /Disallow: / dsc / Disallow: / edc / Disallow: / feed / Disallow: / gsr / Disallow: / gwc / Disallow: / hcp / Disallow: / itc / Disallow: / lit / Disallow: / lst / ng / Disallow: /lvx / Disallow: / mbf / Disallow: / mla / Disallow: / mlt / Disallow: / myb / Disallow: / mys / Disallow: / prp / Disallow: / rcm / Disallow: / sch / % 7C Disallow: /sch / * LH_ Disallow: / sch / aop / Disallow: / sch / ctg / Disallow: / sl / node Disallow: / sme / Disallow: / soc / Disallow: / talk / Disallow: / tickets / Disallow: / today / Disallow: / trylater / Disallow: / urw / write-review / Disallow: / vsp /Disallow: / ws / Disallow: / sch / * modules = SEARCH_REFINEMENTS_MODEL_V2 Disallow: / b / modules = SEARCH_REFINEMENTS_MODEL_V2 Disallow: / itm / _nkw Disallow: / itm / ? Соответствует Запретить: / itm /1046 * & fits Disallow: / cta /

  2. Поэтому перейдите на https://developer.ebay.com/api-docs/developer/static/developer-landing.html и проверьте их документы, на их сайте приведен более простой пример кода, чтобы получить нужные элементы без необходимости очистки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...