2017-05-22 11 views
0

아디다스의 모든 제품을 인쇄하는이 코드는 신제품이 목록에 추가 된 후 긁어서 새 제품을 인쇄하기를 원합니다. 현재는 전체 제품 목록 만 인쇄 할 수 있습니다. 어떻게하면 좋을까요?정기적으로 웹 사이트에서 변경되는 목록에서 오래된 항목을 삭제하는 방법은 무엇입니까?

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) 

답변

0

주기적으로 데이터를 회상 할 수있는 경우, 바로 여기에 간단한 예제입니다 시간 A. 관찰에 비해, 시간 B에서 새로운 제품의 URL이 있는지 확인하십시오.

참고 : urllibrequests으로 바꿨습니다. 또한 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() 방법이 마음에 듭니다.

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']