Ответ 1
Логика паука кажется неправильной.
Я быстро просмотрел ваш сайт и, кажется, есть несколько типов страниц:
- http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html начальная страница
- Веб-страницы для конкретных статей, например. http://www.pwc.com/us/en/tax-services/publications/insights/australia-introduces-new-foreign-resident-cgt-withholding-regime.html, который можно перемещать со страницы # 1
- Фактические местоположения в формате PDF, например. http://www.pwc.com/us/en/state-local-tax/newsletters/salt-insights/assets/pwc-wotc-precertification-period-extended-to-june-29.pdf, который можно перемещать со страницы # 2
Таким образом, правильная логика выглядит так: сначала выберите страницу # 1, затем получите страницы №2, и мы можем загрузить эти страницы № 3.
Однако ваш паук пытается извлечь ссылки на # 3 страницы непосредственно со страницы # 1.
Редакция:
Я обновил ваш код, и вот что-то, что действительно работает:
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)