Я бы хотел скачать бесплатно скачиваемые 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)
# -*- 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. Но я уверен, что это должно сделать работу
Других решений пока нет …