使用 Scrapy 和 Python3 批量下载 pdf
Bulk download of pdf with Scrapy and Python3
我想从 this 尼加拉瓜国民议会网站 Python3
/Scrapy
.
我是编程的绝对初学者 python,但我尝试从一个(未完成的)脚本开始:
#!/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
)
每个问题的 link 中都有一些乱码,因此无法预料,每个 link 都必须在源代码中搜索,例如 link上述报纸的前四期(并非每天都有一期):
#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) 在搜索后出现的 table 中搜索每个 pdf link(在网站源代码 "tableDocCollection" 中调用)。实际的 link 位于 "Acciones" 按钮后面(第一期的 xpath //*[@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) 当我输入搜索时,网站的 link 没有改变。所以看来我必须告诉 Scrapy
插入适当的搜索词(选中标记 "Búsqueda avanzada"、"Colección: Dario Oficial"、"Medio de Publicación: La Gaceta"、时间间隔“06/07/1843 到 31 /12/1900")?
2) 不知道每个pdf如何link可以找到?
如何更新上述脚本,以便我可以下载 06/07/1843 到 31/12/1900 范围内的所有 PDF?
编辑:
#!/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 笔记本电脑上我无法使用 Python3 安装 Scrapy。但我很确定这应该可以完成工作
我想从 this 尼加拉瓜国民议会网站 Python3
/Scrapy
.
我是编程的绝对初学者 python,但我尝试从一个(未完成的)脚本开始:
#!/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
)
每个问题的 link 中都有一些乱码,因此无法预料,每个 link 都必须在源代码中搜索,例如 link上述报纸的前四期(并非每天都有一期):
#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) 在搜索后出现的 table 中搜索每个 pdf link(在网站源代码 "tableDocCollection" 中调用)。实际的 link 位于 "Acciones" 按钮后面(第一期的 xpath //*[@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) 当我输入搜索时,网站的 link 没有改变。所以看来我必须告诉 Scrapy
插入适当的搜索词(选中标记 "Búsqueda avanzada"、"Colección: Dario Oficial"、"Medio de Publicación: La Gaceta"、时间间隔“06/07/1843 到 31 /12/1900")?
2) 不知道每个pdf如何link可以找到?
如何更新上述脚本,以便我可以下载 06/07/1843 到 31/12/1900 范围内的所有 PDF?
编辑:
#!/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 笔记本电脑上我无法使用 Python3 安装 Scrapy。但我很确定这应该可以完成工作