Проблема:
Моя проблема в том, что я написал несколько веб-пауков с селеном Scrapy только для школьных задач и хотел вежливо ползать (DOWNLOAD_DELAY = 5 * на страницу), но мне даже не нужнопотому что сканирование одной страницы занимает слишком много времени. Для поиска всех элементов на одной странице я жду даже 30 секунд , где на каждой странице Я ищу 13 элементов , которые могли бы присутствовать или отсутствовать на странице.
Проблема, которую я обнаружил, связана с терминалом Pycharm IDE, с которого я запускаю скрипт Python и браузер селен-паука веб-бота во время выбора элементов данных по xpath .
Поведение:
Чтомой паук вообще:
- загрузить 500 URL-адресов из .txt файла в словарь
- переходить URL-адреса один за другим
- на каждом URL проверять 13 элементов
- если элементы существуют - собрать данные, если нет, установить по умолчанию
- в конце записать собранные данные в короткий .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](https://i.stack.imgur.com/YVXZI.png)
Я бы даже хотел привести здесь несколько ссылок на подобные проблемы, но я не нашел ни одной.Люди говорили о проблемах в основном на стороне сервера [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:
Не могли бы вы мне объяснить, почему это занимает так много времени, и как это исправить - уменьшите эту явную задержку, пожалуйста?