Это мой фрагмент кода
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 в секунду.
Пожалуйста, помогите !!!