Как парсить только новые ссылки (после предыдущего парсинга) с помощью Python

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

Я попытался добавить ранее очищенные ссылки в пустой список и выполнить остальную часть кода (который загружает и переименовывает файл), только если очищенная ссылка не найдена в списке. Но, похоже, это не работает так, как хотелось бы, потому что каждый раз, когда я запускаю код, он начинается «с 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
706
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

каждый раз, когда вы запускаете это, он воссоздает 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)

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

MSD 10.04.2019 20:20

@MSD вам нужно будет вспомнить, какой контент вы уже тем или иным образом очистили, так что не так уж много способов обойти это. описанный выше метод является самым простым, но есть также такие варианты, как сохранение в базе данных. несмотря ни на что, вам придется вернуть эти данные обратно.

crookedleaf 10.04.2019 21:24

спасибо, и логично. Извините, если это глупый вопрос, но при первом запуске он работает, как и ожидалось, с созданием scraped_name_list.lst'. Но при последующем запуске я получаю UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte. Полный путь with open('/Users/test/Desktop/scraped_name_list.lst', 'wb') as f: pickle.dump(scraped_name_list, f). Нужно ли использовать другое расширение/тип файла? Если это важно, у меня MacOS 10.14.5.

MSD 11.04.2019 00:44

На самом деле, я думаю, что понял это. Замена 'r' на 'rb', кажется, помогает.

MSD 11.04.2019 00:52

@MSD ой. да, я пропустил b. редактировать мой ответ сейчас.

crookedleaf 11.04.2019 00:58

Другие вопросы по теме