我想从尼加拉瓜国民议会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
答案 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。但我很确定这应该做的工作