J'ai été chargé de tirer des fichiers pdf à partir de sites Web à l'aide de Scrapy. Je ne suis pas nouveau sur Python, mais Scrapy est très nouveau pour moi. J'ai expérimenté la console et quelques araignées rudimentaires. J'ai trouvé et modifié ce code:
import urlparse
import scrapy
from scrapy.http import Request
class pwc_tax(scrapy.Spider):
name = "pwc_tax"
allowed_domains = ["www.pwc.com"]
start_urls = ["http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"]
def parse(self, response):
base_url = "http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"
for a in response.xpath('//a[@href]/@href'):
link = a.extract()
if link.endswith('.pdf'):
link = urlparse.urljoin(base_url, link)
yield Request(link, callback=self.save_pdf)
def save_pdf(self, response):
path = response.url.split('/')[-1]
with open(path, 'wb') as f:
f.write(response.body)
J'exécute ce code sur la ligne de commande avec
scrapy crawl mySpider
et je ne reçois rien en retour. Je n'ai pas créé d'élément fragmentaire parce que je veux explorer et télécharger le fichier, pas de métadonnées. J'apprécierais toute aide à ce sujet.
La logique d'araignée semble incorrecte.
J'ai jeté un coup d'œil à votre site Web et il semble qu'il existe plusieurs types de pages:
Ainsi, la logique correcte ressemble à: obtenir la page n ° 1 en premier, obtenir ensuite les pages n ° 2, et nous pourrions télécharger ces pages n ° 3.
Cependant, votre araignée essaie d'extraire des liens vers des pages n ° 3 directement à partir de la page n ° 1.
ÉDITÉ:
J'ai mis à jour votre code, et voici quelque chose qui fonctionne réellement:
import urlparse
import scrapy
from scrapy.http import Request
class pwc_tax(scrapy.Spider):
name = "pwc_tax"
allowed_domains = ["www.pwc.com"]
start_urls = ["http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"]
def parse(self, response):
for href in response.css('div#all_results h3 a::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
)
def save_pdf(self, response):
path = response.url.split('/')[-1]
self.logger.info('Saving PDF %s', path)
with open(path, 'wb') as f:
f.write(response.body)