Программа для загрузки всех файлов PDF с веб-страницы - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь написать программу Python 3, которая загрузит все файлы PDF с этого веб-сайта. В настоящее время у меня есть два кода, но ни один из них не работает.

import requests 
import urllib.request
import urllib.request
import time
import re
from bs4 import BeautifulSoup
url = 'https://fraser.stlouisfed.org/title/1339#556573.html'
response = requests.get(url)
if response.status_code == 200:
      print("Success")
else:
      print("Failure")

soup = BeautifulSoup(response.text, 'html.parser')
for one_a_tag in soup.findAll('a',href=re.compile(r'(.pdf)')):
    link = one_a_tag['href']
    download_url = 'https://fraser.stlouisfed.org/title/1339'+ link
    urllib.request.urlretrieve(download_url) 
    time.sleep(1)

Программа работает без вывода или остановки.

Вторая программа

from urllib import request
from bs4 import BeautifulSoup
import re
import os
import urllib
url="https://fraser.stlouisfed.org/title/1339#518552"
response = request.urlopen(url).read()
soup= BeautifulSoup(response, "html.parser")     
links = soup.find_all('a', href=re.compile(r'(.pdf)'))
url_list = []
for el in links:
    if(el['href'].startswith('http')):
    url_list.append(el['href'])
else:
    url_list.append("https://fraser.stlouisfed.org/title/1339/" + el['href'])

print(url_list)
for url in url_list:
     print(url)
     request.urlretrieve(url, r'C:/Downloads')

Для обеих программ, если я добавлю второй аргумент (filename) в urlretrieve, куда должны загружаться файлы PDF, он выдаст мне

[Errno 13] Отказано в доступе: ошибка «C: / Downloads».

(Я пробовал несколько вещей, чтобы решить эту ошибку, она не работает, у меня Windows). Если у меня нет второго аргумента, вторая программа продолжает работать и производит вывод, но не загружается.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Я не ошибся в использовании вашего кода, но PDF находится на следующей странице. Дайте вам пример использования других платформ только для справки.

import io
from simplified_scrapy import Spider, SimplifiedDoc
class PdfSpider(Spider):
  name = 'stlouisfed'
  concurrencyPer1s = 5
  allowed_domains = ['stlouisfed.org']
  start_urls = ['https://fraser.stlouisfed.org/title/1339']
  refresh_urls = True

  def afterResponse(self, response, url, error=None):
    try:
      # save pdf
      if(response.code==200 and url.find('.pdf')>0):
        name = 'data'+url[url.rindex('/'):]
        file = io.open(name, "wb")
        file.write(response.read())
        file.close()
        return None
      else: # If it's not a pdf, leave it to the frame
        return Spider.afterResponse(self, response, url, error)
    except Exception as err:
      print (err)

  def extract(self,url,html,models,modelNames):
    urls = SimplifiedDoc(html).listA(url=url['url']).containsOr(['/pdf/','.pdf'],attr='url')
    if(urls):
      self.saveUrl(urls)
    return True

from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(PdfSpider()) # Start
0 голосов
/ 16 февраля 2020

В большинстве случаев диск C: / заблокирован, попробуйте сменить диск на X: / или D: / или перенаправить C:/Downloads на C:\Users\Name\Downloads.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...