Как очистить только новые ссылки (после предыдущей очистки) с помощью Python - PullRequest
1 голос
/ 10 апреля 2019

Я очищаю и загружаю ссылки с веб-сайта, и веб-сайт обновляется новыми ссылками каждый день.Мне бы хотелось, чтобы каждый раз, когда мой код запускался, он только очищал / загружал обновленные ссылки с момента последнего запуска программы, а не снова перебирал весь код.

Я пытался добавить ранее очищеннуюссылки на пустой список и выполнение остальной части кода (который загружает и переименовывает файл), только если очищенная ссылка не найдена в списке.Но, похоже, он работает не так, как хотелось бы, каждый раз, когда я запускаю код, он запускается «с 0» и перезаписывает ранее загруженные файлы.

Есть ли другой подход, который я должен попробовать?

Вот мой код (также открыт для общих советов о том, как это убрать и сделать лучше)

import praw
import requests
from bs4 import BeautifulSoup
import urllib.request
from difflib import get_close_matches
import os

period = '2018 Q4'
url = 'https://old.reddit.com/r/test/comments/b71ug1/testpostr23432432/'
headers = {'User-Agent': 'Mozilla/5.0'}
page = requests.get(url, headers=headers)

#set soup
soup = BeautifulSoup(page.text, 'html.parser')
table = soup.find_all('table')[0]

#create list of desired file names from existing directory names
candidates = os.listdir('/Users/test/Desktop/Test')
#set directory to download scraped files to
downloads_folder = '/Users/test/Desktop/Python/project/downloaded_files/'

#create empty list of names
scraped_name_list = []

#scrape site for names and links
for anchor in table.findAll('a'):
    try:
        if not anchor:
            continue
        name = anchor.text
        letter_link = anchor['href']
    #if name doesn't exist in list of names: append it to the list, download it, and rename it
        if name not in scraped_name_list:
            #append it to name list
            scraped_name_list.append(name)
            #download it
            urllib.request.urlretrieve(letter_link, '/Users/test/Desktop/Python/project/downloaded_files/' + period + " " + name + '.pdf')
            #rename it
            best_options = get_close_matches(name, candidates, n=1, cutoff=.33)
            try:
                if best_options:
                    name = (downloads_folder + period + " " + name + ".pdf")
                    os.rename(name, downloads_folder + period + " " + best_options[0] + ".pdf")
            except:
                pass
    except:
        pass
    #else skip it
    else:
        pass

1 Ответ

1 голос
/ 10 апреля 2019

каждый раз, когда вы запускаете это, он воссоздает scraped_name_list как новый пустой список. Вам нужно сохранить список в конце цикла, а затем попытаться импортировать его при любом другом запуске. pickle библиотека отлично подходит для этого.

вместо определения scraped_name_list = [], попробуйте что-то вроде этого

try:
    with open('/path/to/your/stuff/scraped_name_list.lst', 'rb') as f:
        scraped_name_list = pickle.load(f)
except IOError:
    scraped_name_list = []

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

with open('/path/to/your/stuff/scraped_name_list.lst', 'wb') as f:
    pickle.dump(scraped_name_list, f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...