#python #selenium #selenium-webdriver #scrapy
Вопрос:
Устройства, о которых я говорю, имеют следующие характеристики:
->настольный ПК, Intel i5 4690, 16 гигабайт оперативной памяти, подключение к Ethernet (загрузка~500 Мбит / с, загрузка ~750 Мбит / с)
->ноутбук, Intel i7-3520M, 8 гигабайт оперативной памяти, подключение к Wi-Fi (загрузка~100 Мбит / с, загрузка ~120)
Скорость соединения загрузка загрузка была протестирована с использованием speedtest.net, убедившись, что запросы поступают на один и тот же сервер, чтобы не было несоответствия между двумя устройствами.
Я использую буквально один и тот же код для обоих устройств. Я написал его на настольном компьютере, а затем просто перенес весь проект на ноутбук.
Во — первых, позвольте мне показать вам результаты скребковой скамьи:
laptop (worse)
2021-09-05 12:56:25 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 113852,
'downloader/request_count': 293,
'downloader/request_method_count/GET': 293,
'downloader/response_bytes': 730855,
'downloader/response_count': 293,
'downloader/response_status_count/200': 293,
'elapsed_time_seconds': 10.813298,
'finish_reason': 'closespider_timeout',
'finish_time': datetime.datetime(2021, 9, 5, 9, 56, 25, 216524),
'log_count/INFO': 20,
'request_depth_max': 13,
'response_received_count': 293,
'scheduler/dequeued': 293,
'scheduler/dequeued/memory': 293,
'scheduler/enqueued': 5859,
'scheduler/enqueued/memory': 5859,
'start_time': datetime.datetime(2021, 9, 5, 9, 56, 14, 403226)}
desktop
2021-09-05 13:13:50 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 216900,
'downloader/request_count': 503,
'downloader/request_method_count/GET': 503,
'downloader/response_bytes': 1467597,
'downloader/response_count': 503,
'downloader/response_status_count/200': 503,
'elapsed_time_seconds': 10.689637,
'finish_reason': 'closespider_timeout',
'finish_time': datetime.datetime(2021, 9, 5, 10, 13, 50, 146422),
'log_count/INFO': 20,
'request_depth_max': 19,
'response_received_count': 503,
'scheduler/dequeued': 503,
'scheduler/dequeued/memory': 503,
'scheduler/enqueued': 10060,
'scheduler/enqueued/memory': 10060,
'start_time': datetime.datetime(2021, 9, 5, 10, 13, 39, 456785)}
2021-09-05 13:13:50 [scrapy.core.engine] INFO: Spider closed (closespider_timeout)
У Scrapy гораздо лучшая статистика на рабочем столе.
Вот мой паук, просто чтобы посмотреть, что я использую, потому что, как я уже сказал, на обоих устройствах один и тот же паук.
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders.init import InitSpider
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from scrapy.selector import Selector
from scrapy_selenium import SeleniumRequest
class ExampleSpider(InitSpider):
name = 'example'
def init_request(self):
yield SeleniumRequest(
url='https://www.ejobs.ro/',
wait_time=3,
callback=self.search
)
return self.initialized()
def search(self, response):
driver = response.meta['driver']
search_input = driver.find_element_by_xpath("//input[@id='keyword']")
search_input.send_keys("programator")
search_input2 = driver.find_element_by_xpath("//input[@id='s2id_autogen1']")
search_input2.send_keys("bucuresti")
selectieOras = driver.find_element_by_xpath("//input[@id='s2id_autogen1_search']")
selectieOras.send_keys(Keys.ENTER)
submit = driver.find_element_by_xpath("//button[@id='submit']")
driver.execute_script("arguments[0].click();", submit)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchSection"))
)
finally:
yield SeleniumRequest(
url=driver.current_url,
wait_time=3,
callback=self.parse
)
def parse(self, response):
driver = response.meta['driver']
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchSection"))
)
finally:
html = driver.page_source
response_obj = Selector(text=html)
links = response_obj.xpath("//div[@class='jobitem-body']")
for link in links:
URL = link.xpath(".//a[contains(@class, 'title')]/@href").get()
if URL:
yield SeleniumRequest(
url=URL,
wait_time=3,
callback=self.parse_res
)
# next = response_obj.xpath("//div[@id='searchPagination']/li[@class='next']/a/@href")
# if next:
# hrefLink = next.get()
# yield SeleniumRequest(
# url=hrefLink,
# wait_time=3,
# callback=self.parse
# )
def parse_res(self, response):
yield {
'title': response.xpath("//h1[@class='jobad-title']/text()").get()
}
What I’ve tried:
-making sure that I have the same version of Scrapy on both devices (2.5.0 is installed on both)
-making sure that I have the same version of Selenium on both devices (3.141.0 is installed on both)
-making sure that I have the same version of Anaconda3 on both devices (2021.05 python 3.8.8 64-bit is installed on both)
-убедитесь, что у меня на обоих устройствах установлена одна и та же версия Firefox (на обоих установлен 91.0.2)
-убедитесь, что у меня на обоих устройствах установлена одна и та же версия scrapy-selenium (на обоих установлено 0.0.7)
-Я использую то же самое geckodriver.exe (потому что, как я уже сказал, я просто скопировал и вставил проект с рабочего стола на ноутбук)
-создание нового, чистого рабочего пространства на anaconda, установив только scrapy, selenium и scrapy-selenium
-очистка DNS на рабочем столе
-удаление всех временных данных и просмотра данных на рабочем столе
Ничего не сработало. Единственные различия, которые я знаю, это:
-на рабочем столе есть Python 3.7.415.0, в то время как на ноутбуке есть 3.7.315.0 (я не думаю, что это проблема, если это просто скажите мне, и я понижу версию Python на рабочем столе)
-ОС на рабочем столе-Windows 10 Education N, ОС на ноутбуке-Windows 10 Pro (я тоже не думаю, что в этом проблема)
Проблема в том, что запуск этого паука на моем ноутбуке намного быстрее, чем на ПК. На ПК каждый запрос занимает ~7 секунд (иногда 6), в то время как на ноутбуке он занимает максимум 4 секунды (колеблется, иногда запрос занимает 1 секунду, иногда 2, иногда 3, в то время как на ПК каждый раз требуется 7 секунд, редко только 6 секунд), и я не могу понять, почему.
Я перепробовал все, что мог придумать. В чем может быть проблема?
Ответ №1:
На вашем рабочем столе больше (и, возможно, быстрее) оперативной памяти. Кроме того, скорость жесткого диска и приложения, работающие в фоновом режиме, будут влиять на производительность.