Массовая загрузка PDF с помощью Scrapy и Python3 - PullRequest
0 голосов
/ 03 мая 2018

Я бы хотел скачать бесплатно загружаемые 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

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

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

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

b) для отображения названия проблемы, которую он загружает и которую можно найти за кнопкой «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?

Edit:

#!/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)

1 Ответ

0 голосов
/ 05 мая 2018
# -*- 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. Но я уверен, что это должно сделать работу

...