使用Scrapy和Python3批量下载pdf

时间:2018-05-03 11:19:48

标签: php curl download wget bulk

我想从尼加拉瓜国民议会this网站批量下载免费下载pdf(1843年至1900年旧报纸的副本,名为Gaceta)Python3 / {{1 }}

我是编程和python的绝对初学者,但尝试从一个(未完成的)脚本开始:

Scrapy

每个问题的链接都有一些乱码,所以无法预料到它们,并且必须在源代码中搜索每个链接,例如,查看指向该报的前四个可用问题的链接(不是每天都有)发了一份副本):

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

我的问题是我无法一起找到一个有效的脚本。

我想让我的脚本:

a)搜索搜索后出现的表格内的每个pdf链接(在网站源代码“tableDocCollection”中调用)。实际链接位于“Acciones”按钮(第一期#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 )的xpath

后面

b)显示正在下载的问题的名称,该名称可以在“Acciones”按钮后面找到(第一期//*[@id="tableDocCollection"]/tbody/tr[1]/td[5]/div/ul/li[1]/a显示的名称的路径)。

编写脚本时遇到的主要问题是:

1)当我输入搜索时,网站的链接不会改变。因此,似乎我必须告诉//*[@id="tableDocCollection"]/tbody/tr[1]/td[5]/div/ul/li[2]/a插入适当的搜索词(复选标记“Búsquedavanzada”,“Colección:Dario Oficial”,“MediodePublicación:La Gaceta”,时间间隔“06/07 / 1843年至31/12/1900“)?

2)我不知道如何找到每个pdf链接?

如何更新上述脚本以便我可以下载06/07/1843至31/12/1900范围内的所有PDF?

修改

Scrapy

1 个答案:

答案 0 :(得分:1)

# -*- 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笔记本电脑上,我无法使用Python3安装Scrapy。但我很确定这应该做的工作