2016-06-30 1 views
-1

아래의 '데이터'섹션에있는 4 자리 수 상점 번호를 통해 여러 상점을 한 번에 검색 할 수 있도록 아래 코드를 수정하고 싶습니다. 가장 좋은 방법은 무엇입니까? 가급적 검색을 50-100 개로 제한 할 수 있습니다.URL 중간에 변수를 증가시키고 여러 쿼리를 출력하는 방법은 무엇입니까?

import requests 
import json 

js = requests.post("http://www.walmart.com/store/ajax/search", 
       data={"searchQuery":"store=2516&size=18&dept=4044&query=43888060"}).json() 

data = json.loads(js['searchResults']) 

res = data["results"][0] 
print(res["name"], res["inventory"]) 

나는 위의 줄에 인쇄 된 상점 #을 원합니다.

답변

0

data request.post 호출의 객체는 다른 모든 문자열처럼 구성 할 수 있습니다. 그리고 그것을 나타내는 변수는 "store = 2516 ..."문자열 대신 사용할 수 있습니다. 이처럼 가정 requests는 외부 함수 곳에서 정의하고 재사용 할 수 있습니다 :

var stores = ["2516","3498","5478"]; 
stores.forEach(makeTheCall); 

function makeTheCall(element, index, array) { 
    storeQuery = "store=" + element + "&size=18&dept=4044&query=43888060"; 
    js = requests.post("http://www.walmart.com/store/ajax/search", 
      data={"searchQuery":storeQuery}).json() 
    data = json.loads(js['searchResults']) 
    res = data["results"][0] 
    console.log("name: " + res["name"] + ", store: " + element + ", inventory: " + res["inventory"]); 
} 

내가 "인쇄"의 사용에 익숙하지 않은 해요,하지만 난 오직 클라이언트 측 자바 스크립트를 사용했습니다.

+0

Err. 질문은 자바 스크립트가 아니라 파이썬에 관한 것이 었습니다. – nephtes

+0

하하, 하루 종일 자바 스크립트를 쳐다 보면서 알지 못했습니다. 죄송합니다. 어쨌든 내 대답의 원근법이 효과가 없다면 놀라지 않을 것입니다. 스토어 번들 배열을 반복하고 각각에 대해 문자열을 생성하고 request.post 함수에 searchQuery 속성의 값으로 제출하십시오. stores.forEach 대신에'store in store '를 사용하고 싶습니다. – dcoli

0

API는 여러 저장소를 검색 할 수 없으므로 여러 요청을해야합니다.

import requests 
import json 
from collections import defaultdict 

results = defaultdict(list) 

stores = [2516, 1234, 5678] 
url = "http://www.walmart.com/store/ajax/search" 
query = "store={}&size=18&dept=4044&query=43888060" 

for store in stores: 
    r = requests.post(url, data={'searchQuery': query.format(store)}) 
    r.raise_for_status() 
    try: 
     data = json.loads(r.json()['searchResults'])['results'][0] 
     results[store].append((data['name'],data['inventory'])) 
    except IndexError: 
     continue 

for store, data in results.iteritems(): 
    print('Store: {}'.format(store)) 
    if data: 
     for name, inventory in data: 
      print('\t{} - {}'.format(name, inventory)) 
+0

고마워요. - 특정 저장소가 특정 저장소에 대해 반환 된 json에 기반한 인벤토리를 가지고 있지 않으면 오류가 발생하지만,이 방법은 효과적입니다. 그 문제를 해결하기위한 제안? –

+0

그냥 try/except를 추가하십시오. –

+0

상점에 대한 json을 보면 인벤토리가없는 사용자는 "결과": [결과] : [많은 변수] '가있는 json을 갖게됩니다. 어떻게 바이 패스하도록 쿼리를 구성 할 수 있습니까? 빈 결과가있는 사람들? - 그냥 답장을 보았습니다 - 나는 try/expect recommendation을 살펴볼 것입니다. 감사합니다! –

관련 문제