Загрузите все связанные файлы .PDF для определенной темы с глубиной - PullRequest
0 голосов
/ 31 октября 2018

Я очень плохо знаком с python и scrapy. Моя задача - загрузить файлы .PDF для определенной темы. Пример: на этом сайте было больше контрактов ** https://www.sec.gov/ ** в настоящее время я загружаю файлы один за другим. Я должен написать программу scrapy, чтобы загрузить все связанные файлы .PDF, используя ключевое слово для поиска, например ** Keyword: Exhibit 10 / EXHIBIT 11 **

## My Code ##

    #import urllib
import scrapy

from scrapy.http import Request

class pwc_tax(scrapy.Spider):
  name = "pwc_tax"

  allowed_domains = ["www.sec.gov"]
  start_urls = ["https://www.sec.gov/cubist-pharmaceuticals-inc-exhibit-10-65-10-k405"]

  def parse(self, response):
    base_url = 'https://www.sec.gov/'

    for a in response.xpath('//a[@href]/@href'):
        link = a.extract()
        # self.logger.info(link)

        if link.endswith('.pdf'):
            #link = urllib.parse.urljoin(base_url, link)
        link = base_url + link
            self.logger.info(link)
            yield Request(link, 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)

Используя этот код, я могу загружать PDF только по заданному URL. Пример: https://www.sec.gov/cubist-pharmaceuticals-inc-exhibit-10-65-10-k405 (Если я дал вышеуказанный URL-адрес, файл загружался, но для этого я могу загрузить вручную, я должен загрузить весь PDF, который был предметом поиска) если я буду искать по ключевому слову Exhibit 10 , появится следующая страница https://secsearch.sec.gov/search?utf8=%3F&affiliate=secsearch&query=exhibit+10, и я захочу разобраться, чтобы открыть все ссылки и скачать все файлы в формате PDF. Если кто-нибудь поможет мне решить этот код. Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Сначала вы должны взять URL-адрес поискового запроса в start_urls и из ответа start_url извлечь все URL-адреса и отправить запрос каждому из них. После этого извлеките ссылку в формате PDF и сохраните ее в локальном хранилище.

Код будет выглядеть примерно так:

import scrapy

from scrapy.http import Request


class pwc_tax(scrapy.Spider):
    name = "pwc_tax"

    allowed_domains = ["www.sec.gov", 'search.usa.gov', 'secsearch.sec.gov']
    start_urls = ["https://secsearch.sec.gov/search?utf8=%E2%9C%93&affiliate=secsearch&sort_by=&query=Exhibit+10%2F+EXHIBIT+11"]

    def parse(self, response):
        # extract search results
        for link in response.xpath('//div[@id="results"]//h4[@class="title"]/a/@href').extract():
            req = Request(url=link, callback=self.parse_page)
            yield req

    def parse_page(self, response):
        # parse each search result here
        pdf_files = response.xpath('//div[@class="article-file-download"]/a/@href').extract()
        # base url wont be part of this pdf_files
        # sample: [u'/files/18-03273-E.pdf']
        # need to add at the beginning of each url
        # response.urljoin() will do the task for you
        for pdf in pdf_files:
            if pdf.endswith('.pdf'):
                pdf_url = response.urljoin(pdf)
                req = Request(url=pdf_url, callback=self.save_pdf)
                yield req

    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)
...