Сканирование Python Scrapy занимает слишком много времени с использованием выбора элементов xpath с селеном в хром - PullRequest
0 голосов
/ 01 октября 2018

Проблема:

Моя проблема в том, что я написал несколько веб-пауков с селеном Scrapy только для школьных задач и хотел вежливо ползать (DOWNLOAD_DELAY = 5 * на страницу), но мне даже не нужнопотому что сканирование одной страницы занимает слишком много времени. Для поиска всех элементов на одной странице я жду даже 30 секунд , где на каждой странице Я ищу 13 элементов , которые могли бы присутствовать или отсутствовать на странице.

Проблема, которую я обнаружил, связана с терминалом Pycharm IDE, с которого я запускаю скрипт Python и браузер селен-паука веб-бота во время выбора элементов данных по xpath .

Поведение:

Чтомой паук вообще:

  1. загрузить 500 URL-адресов из .txt файла в словарь
  2. переходить URL-адреса один за другим
  3. на каждом URL проверять 13 элементов
  4. если элементы существуют - собрать данные, если нет, установить по умолчанию
  5. в конце записать собранные данные в короткий .csv

Терминал будет запрашивать при включенном методе POSTБраузер селена Chrome для поиска определенного элемента по xpath и , если этот элемент отсутствует на веб-странице , браузер селена Chrome всегда будет реагировать с задержкой в ​​5 секунд на поиск одного элемента xpath..

Страница в браузере селена будет загружаться быстро - за одну секунду.

Документация:

Если элемент не найден, возникает исключение, которое я трактую так в коде паука (IDE ждет 5секунд для селена Chrome, чтобы выдать исключение):

# 1. name
try:
    # If not found element, it will fill with sth
    element = self.driver.find_element_by_xpath('// *[ @ id = "h1c"] / h1')
    # get data - but if element is not found, throw exception - because get attr.
    name = str(element.get_attribute('innerHTML'))
except:
    name = "empty"

Загрузка URL для сканирования [* Обновлено]:

def start_requests(self):

    temp_dictionary = []
    # OPEN FILE AND LOAD URLS HERE
    with open("products_urls_en.txt") as file:
        for line in file:
            temp_dictionary.append({'url': line})

    # REMOVE DUPLICATES - if any  /6215172/udalenie-dublikatov-iz-slovarya

    products_url_links = []

    for value in temp_dictionary:
        if value not in products_url_links:
            products_url_links.append({'url': value.get('url')})

    print("NUM OF LINKS: " + str(len(products_url_links)))
    self.counter_all = int(len(products_url_links))

    for url in products_url_links:
        yield scrapy.Request(url=url.get('url'), callback=self.parse)

Во время сканирования я описал вывод терминала, описанный выше:

enter image description here

Я бы даже хотел привести здесь несколько ссылок на подобные проблемы, но я не нашел ни одной.Люди говорили о проблемах в основном на стороне сервера [1] [2] , но я думаю, что проблема на моей стороне.

Настройки и версии

  • Python - 3,6, пипс 18,0
  • Pycharm - 2018.1.5
  • Selenium - 3.14.0 (я думаю - последний - был загружен через Pycharm IDE)
  • Scrapy - 1.5.1 (я думаю - последний - был загружен через Pycharm IDE)
  • Windows - Win10 Pro 2018
  • SpiderSettings - все по умолчанию (я пробовал вежливые настройки - проблема не изменилась)

Q:

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

1 Ответ

0 голосов
/ 01 октября 2018

Вы, вероятно, используете implicit_wait 5 секунд.Из-за этого, когда find_element ничего не находит, он ждет 5 секунд, чтобы дать ему шанс появиться ...

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