Scrapy CONCURRENT_REQUESTS и DOWNLOAD_DELAY не работают - PullRequest
0 голосов
/ 01 марта 2020

Это мой фрагмент кода

import scrapy
class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    custom_settings = {
        'CONCURRENT_REQUESTS': 25,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 100,
        'DOWNLOAD_DELAY': 0
    }

    f = open("list.txt")
    start_urls = [url.strip() for url in f.readlines()]
    f.close()

    def parse(self, response):
        for quote in response.xpath("//div[@class='border block']"):
            urlgem = quote.xpath(".//div[@class='col-md-4 pull-right']/a/@href").extract()
            if urlgem:
                yield {
                    'text': urlgem,
                }

С помощью терминала я выполняю приведенный выше код с помощью команды

scrapy runspider quotes_spider.py -o quotes.json

list.txt содержит 50 URL того же домена, разделенных строками

Насколько я понимаю, код должен помещать 25 запросов к домену для 25 URL-адресов (из списка из 50 URL-адресов), должен завершаться за 2-3 секунды и генерировать кавычки с именами файлов. json

Вывод в кавычки файла. json выходит, как и ожидалось, но SCRAPY не выполняет задачу одновременно, вместо этого он выбирает URL один за другим, и его выполнение занимает приблизительно 55-60 секунд.

Еще один код, который Я написал, используя BeautifulSoup, выполняя ту же задачу, что и выше

from multiprocessing import Pool
import requests
from bs4 import BeautifulSoup

base_url = 'https://SOMEWEBSITE.com/search_by='
all_urls = list()

def generate_urls():
    for i in range(480882, 480983):
        all_urls.append(base_url + str(i))

def scrape(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text, 'lxml')
    pageText = soup.find_all('div', {'class': 'border block'})

    for bidBox in pageText:
        bidNumber = bidBox.find('p', {'class': 'bid_no pull-left'})
        print(bidNumber.text)
        bidStatus = bidBox.find('span', {'class': 'text-success'})
        print(bidStatus.text)

generate_urls()

p = Pool(50)
p.map(scrape, all_urls)
p.terminate()
p.join()

Выше кода, выполняемого в терминале с помощью команды

python3 quotes.py

Выше также приводят к тому же результату. Выходные данные соответствуют ожидаемым, но время выполнения составляет ок. 1 URL в секунду.

Пожалуйста, помогите !!!

...