Как получить последний файл PDF по заданному коду с использованием Python - PullRequest
0 голосов
/ 15 ноября 2018

Я попробовал следующий код, чтобы загрузить все PDF-файлы по ссылкам, но с этим он загружает все файлы, когда я запускаю этот код каждый раз.Рекомендовано: в первый раз он должен загрузить все файлы в формате pdf, а в следующий раз он должен загрузить только то, которое является новым (сначала следует проверить, какое из них новое) Мой код:

import requests
from bs4 import BeautifulSoup

root_url = 'https://www.iea.org'

def getLinks(url):
    all_links = []
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')
    for href in soup.find_all(class_='omrlist'):
        all_links.append(root_url + href.find('a').get('href'))
    return all_links
yearLinks = getLinks(root_url +'/oilmarketreport/reports/')
# get report URL
reportLinks = []
for url in yearLinks:
    links = getLinks(url)
    #reportLinks.extend(links)

#print(reportLinks)
i =0
for url_ in links:
    if "AnnualStatisticalSupplement" not in url_:
        url__ = url_.replace("org..", "org").replace("../", "")
        response = requests.get(url__, stream=True)
        lastindex= url__.rfind('/')
        strlen = len(url__)
        filename = url__[lastindex:strlen]
        with open('/home/pdfs/'+ str(filename), 'wb') as pdffile:
            pdffile.write(response.content)
            i += 1
            print(url__)

print("Download Completed")

Затем мне нужно сохранитьэтот файл - Mongo DB, как мне сделать это, сделав три столбца (имя pdf, отчетная дата, флаг процесса).

1 Ответ

0 голосов
/ 16 ноября 2018

Извините за значительные изменения в вашем коде.потому что ваш код слишком грязный для чтения.Если вы хотите скачать pdf, которого у вас уже нет, вы должны добавить if-loop, чтобы контролировать свои действия.Кстати, если вы добавите URL-адрес страницы в свою базу данных, вам не нужно будет обращаться еще раз, чтобы получить имя PDF.

import requests
from bs4 import BeautifulSoup

root_url = 'https://www.iea.org'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'}

downloaded = ["2018-02-13.pdf"] # the latest i have

def getLinks(url):
    page = requests.get(url,headers=headers)
    soup = BeautifulSoup(page.text, 'lxml')
    li = soup.find_all("li",class_="omrlist")
    links =  [root_url + href.a.get('href') for href in li]
    return links

def get_pdf(url,flag=1):
    # find page link in the month directory

    pdf_page = requests.get(url,headers=headers)
    soup = BeautifulSoup(pdf_page.text, 'lxml')
    li = soup.find_all("li",class_="omrlist")[::-1] # latest -> old
    latest_pdf_set = [root_url + href.a.get('href')  for href in li]

    # find pdf link
    pdf_links = []
    for pdf_url in latest_pdf_set:
        text = requests.get(pdf_url,headers=headers).text
        soup = BeautifulSoup(text,"lxml")
        link = soup.find("div",class_="omrreport pL10").find("a").get("href")
        if link.split("/")[-1] in downloaded:
            flag = 0 # if flag = 0 means you found the pdf that you already had
            break
        pdf_links.append(root_url + link)

    return pdf_links,flag

yearLinks = getLinks(root_url +'/oilmarketreport/reports/')

all_ = []

for each in yearLinks:
    pdf_links = get_pdf(each)
    all_ += pdf_links[0]
    if not pdf_links[1]:
        # flag = 0 break 
        break

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