Scrapy работает медленнее на лучшем устройстве, чем на худшем, и я не могу понять, почему

#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:

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