Как удалить старые элементы из списка, который периодически меняется с веб-сайта?

Итак, у меня есть этот код, который печатает все продукты на adidas US, и я хочу, чтобы он проверял, когда новые продукты добавлялись в список, а затем распечатывал этот новый продукт. Прямо сейчас он может распечатать только весь список продуктов. Как бы я это сделал?

from bs4 import BeautifulSoup
import urllib.request
import re
import urllib.parse
import time

headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
                "Accept-Language" : "en-US,en;q=0.8"}

url = 'http://www.adidas.com/on/demandware.static/-/Sites-adidas-US-Library/en_US/v/sitemap/product/adidas-US-en-us-product.xml'

values = {'s':'search',
'submit':'search'}


data = urllib.parse.urlencode(values)
data = data.encode('utf-8')

req = urllib.request.Request(url, data, headers=headers)
resp = urllib.request.urlopen(req)
respData = resp.read()

rawdata = re.findall(r'<loc>(.*?)</loc>', str(respData))

for Product_list in rawdata:
    print(Product_list) 

1 ответ

Если вы можете периодически собирать данные, просто проверьте, есть ли новые URL-адреса продуктов во время B, по сравнению с теми, которые наблюдались во время A. Вот короткий пример.

Примечание: я заменил urllib с requests, Кроме того, вы импортировали BeautifulSoup но не использовал - я использовал здесь вместо re, Ни одна из этих замен не является строго необходимой, это всего лишь мои личные предпочтения.

from bs4 import BeautifulSoup
import requests

headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", "Accept-Language" : "en-US,en;q=0.8"}
url = 'http://www.adidas.com/on/demandware.static/-/Sites-adidas-US-Library/en_US/v/sitemap/product/adidas-US-en-us-product.xml'
values = {'s':'search', 'submit':'search'}

# replace urllib with requests
r = requests.post(url, values, headers=headers)
soup = BeautifulSoup(r.text)

# replace re with soup
products = [str(p.text) for p in soup.find_all('loc')]

# sample output
print(products[0:5])
['http://www.adidas.com/us/ultraboost-shoes/BA8842.html',
 'http://www.adidas.com/us/ultraboost-shoes/BA8843.html',
 'http://www.adidas.com/us/crazypower-trainer-shoes/BA8929.html',
 'http://www.adidas.com/us/alphabounce-aramis-shoes/B54366.html',
 'http://www.adidas.com/us/harden-vol.-1-shoes/B39494.html']

Допустим, вы снова извлекаете данные, используя тот же процесс, и получаете следующий ответ. Первая ссылка скопирована с productsи вторая ссылка новая:

new_products = ['http://www.adidas.com/us/ultraboost-shoes/BA8842.html',
                'http://www.adidas.com/us/ultraboost-shoes/foo.html']

Существует несколько способов проверить наличие элементов из одного списка в другом списке. мне нравится isin() метод, предлагаемый Pandas:

import pandas as pd
new_products = pd.Series(new_products)

# get only new products not in old products
mask = ~new_products.isin(products)
new_products[mask].values
['http://www.adidas.com/us/ultraboost-shoes/foo.html']
Другие вопросы по тегам