Массовая загрузка PDF с помощью Scrapy и Python3

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

Я абсолютный новичок в программировании и Python, но попытался начать с (n незаконченного) сценария:

#!/usr/bin/env python3

from urllib.parse import urlparse
import scrapy

from scrapy.http import Request

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

def parse(self, response):
for href in response.css('div#gridTableDocCollection::attr(href)').extract():
yield Request(
url=response.urljoin(href),
callback=self.parse_article
)

def parse_article(self, response):
for href in response.css('div.download_wrapper a[href$=".pdf"]::attr(href)').extract():
yield Request(
url=response.urljoin(href),
callback=self.save_pdf
)

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

#06/07/1843
http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=nYgT5Rcvs2I%3D

#13/07/1843
http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=3sAxsKCA6Bo%3D

#28/07/1843
http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=137YSPeIXg8%3D

#08/08/1843
http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=aTvB%2BZpqoMw%3D

Моя проблема в том, что я не могу собрать рабочий скрипт вместе.

Я хотел бы, чтобы мой сценарий:

а) искать каждую PDF-ссылку в таблице, которая появляется после поиска (вызывается в исходном коде веб-сайта «tableDocCollection»). Фактическая ссылка находится за кнопкой «Acciones» (путь к первому выпуску //*[@id="tableDocCollection"]/tbody/tr[1]/td[5]/div/ul/li[1]/a)

б) для отображения названия проблемы, которую он загружает и которую можно найти за кнопкой «Acciones» (путь к названию, отображаемому для первой проблемы //*[@id="tableDocCollection"]/tbody/tr[1]/td[5]/div/ul/li[2]/a).

Основные проблемы, с которыми я сталкиваюсь при написании сценария:

1) что ссылка на сайт не меняется при вводе в поиске. Так что, похоже, я должен сказать Scrapy вставить соответствующие поисковые термины (галочка «Búsqueda avanzada», «Colección: Dario Oficial», «Medio de Publicación: La Gaceta», интервал времени «с 07.07.1843 по 31.12.1900»)?

2) что я не знаю, как можно найти каждую ссылку PDF?

Как я могу обновить вышеупомянутый скрипт, чтобы я мог загрузить все PDF в диапазоне от 06/07/1843 до 31/12/1900?

Редактировать:

#!/usr/bin/env python3
from urllib.parse import urlparse
import scrapy

from scrapy.http import Request

frmdata = {"rdds":[{"rddid":"+1RiQw3IehE=","anio":"","fecPublica":"","numPublica":"","titulo":"","paginicia":null,"norma":null,"totalRegistros":"10"}
url = "http://digesto.asamblea.gob.ni/consultas/coleccion/"r = FormRequest(url, formdata=frmdata)
fetch(r)

yield FormRequest(url, callback=self.parse, formdata=frmdata)

0

Решение

# -*- coding: utf-8 -*-
import errno
import json
import os

import scrapy
from scrapy import FormRequest, Request


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

papers = {
#    "Diario de Circulación Nacional" : "176",
"Diario Oficial": "28",
#    "Obra Bibliográfica": "31",
#    "Otro": "177",
#    "Texto de Instrumentos Internacionales": "103"}

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)

Мой ноутбук не подлежит ремонту, и на запасном ноутбуке с Windows я не могу установить Scrapy с Python3. Но я уверен, что это должно сделать работу

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector