Ускорение Scrapy Python3 скрипт

Я бы хотел скачать бесплатно скачиваемые PDF-файлы (копии старой газеты с 1843 по 1900 год под названием Gaceta) из этот веб-сайт Национального собрания Никарагуа с Python3/Scrapy (см. предыдущий вопрос Вот) используя следующий скрипт:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# A scrapy script to download issues of the Gaceta de Nicaragua (1843-1961)

# virtualenv -p python3 envname
# source envname/bin/activate
# scrapy runspider gaceta_downloader.py

import errno
import json
import os

import scrapy
from scrapy import FormRequest, Request

pwd="/Downloads"os.chdir(pwd) # this will change directory to pwd path.
print((os.getcwd()))

class AsambleaSpider(scrapy.Spider):
name = 'asamblea'
allowed_domains = ['asamblea.gob.ni']
start_urls = ['http://digesto.asamblea.gob.ni/consultas/coleccion/']

papers = {
"Diario Oficial": "28",
}

def parse(self, response):

for key, value in list(self.papers.items()):
yield FormRequest(url='http://digesto.asamblea.gob.ni/consultas/util/ws/proxy.php',
headers= {
'X-Requested-With': 'XMLHttpRequest'
}, formdata= {
'hddQueryType': 'initgetRdds',
'cole': value
}
, meta={'paper': key},
callback=self.parse_rdds
)
pass

def parse_rdds(self, response):
data = json.loads(response.body_as_unicode())
for r in data["rdds"]:
r['paper'] = response.meta['paper']
rddid = r['rddid']
yield Request("http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=" + rddid,
callback=self.download_pdf, meta=r)

def download_pdf(self, response):
filename = "{paper}/{anio}/".format(**response.meta) + "{titulo}-{fecPublica}.pdf".format(**response.meta).replace("/", "_")
if not os.path.exists(os.path.dirname(filename)):
try:
os.makedirs(os.path.dirname(filename))
except OSError as exc:  # guard against race condition
if exc.errno != errno.EEXIST:
raise

with open(filename, 'wb') as f:
f.write(response.body)

Сценарий выполняет свою работу по извлечению прямых ссылок из php файл и скачивание PDF впоследствии, однако есть две вещи, которые все еще не дают мне покоя:

  1. Я хотел бы иметь возможность установить временной диапазон Gacetas, который я хотел бы скачать, я. е. все выпуски (доступны) с 01.01.1844 по 01.01.1900. Я пытался понять это безрезультатно, поскольку я новичок в программировании.
  2. Я хотел бы ускорить сценарий. Может быть с xargs? На данный момент он выглядит довольно медленным в исполнении, хотя я его не измерял.

2

Решение

отказ: Я не тестировал скрипт, так как для scrapy требуется Microsoft Visual C ++ 14.0, а загрузка и установка занимает некоторое время 🙁

Вот обновленный скрипт, я добавил диапазон дат как start а также end и изменил parse_rdds способ загружать файлы только в сроки.

Что касается оптимизации, scrapy — это неблокирующая библиотека, и, насколько я понимаю, она должна иметь возможность загружать несколько файлов параллельно, как это происходит сейчас. Имейте в виду, что вы загружаете много файлов, что, естественно, может занять некоторое время.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# A scrapy script to download issues of the Gaceta de Nicaragua (1843-1961)

# virtualenv -p python3 envname
# source envname/bin/activate
# scrapy runspider gaceta_downloader.py

import errno
import json
import os
from datetime import datetime

import scrapy
from scrapy import FormRequest, Request

pwd="/Downloads"os.chdir(pwd) # this will change directory to pwd path.
print((os.getcwd()))


# date range, format DD/MM/YYYY
start = '16/01/1844'
end = '01/01/1900'

date_format = '%d/%m/%Y'
start = datetime.strptime(start, date_format)
end = datetime.strptime(end, date_format)


class AsambleaSpider(scrapy.Spider):
name = 'asamblea'
allowed_domains = ['asamblea.gob.ni']
start_urls = ['http://digesto.asamblea.gob.ni/consultas/coleccion/']

papers = {
"Diario Oficial": "28",
}

def parse(self, response):

for key, value in list(self.papers.items()):
yield FormRequest(url='http://digesto.asamblea.gob.ni/consultas/util/ws/proxy.php',
headers= {
'X-Requested-With': 'XMLHttpRequest'
}, formdata= {
'hddQueryType': 'initgetRdds',
'cole': value
}
, meta={'paper': key},
callback=self.parse_rdds
)
pass

def parse_rdds(self, response):
data = json.loads(response.body_as_unicode())
for r in data["rdds"]:
if not r['fecPublica']:
continue

r_date = datetime.strptime(r['fecPublica'], date_format)

if start <= r_date <= end:
r['paper'] = response.meta['paper']
rddid = r['rddid']
yield Request("http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=" + rddid,
callback=self.download_pdf, meta=r)

def download_pdf(self, response):
filename = "{paper}/{anio}/".format(**response.meta) + "{titulo}-{fecPublica}.pdf".format(**response.meta).replace("/", "_")
if not os.path.exists(os.path.dirname(filename)):
try:
os.makedirs(os.path.dirname(filename))
except OSError as exc:  # guard against race condition
if exc.errno != errno.EEXIST:
raise

with open(filename, 'wb') as f:
f.write(response.body)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]