2017-03-06 2 views
1

다음은 Scrapy 로그에 400 오류가 발생하는 코드입니다. 이 코드의 논리는 다음과 같습니다. 1) 게시물 요청을 사용하여 내 Secret_Token을 가져옵니다. 2) 비밀 토큰을 사용하도록 헤더를 설정하고 API 검색 문자열에 대한 매개 변수를 정의합니다. 또한 Secret_token 헤더는 추가 요청을 위해 메타로 전달되어야한다고 생각합니다. 3) 여기에 # 2에서 요청에서 json 응답을 받아 Parse 함수가 항목으로 구문 분석 할 것으로 기대합니다. 준비 및 작동중인 요청 # 2에 대한 매개 변수 목록이있는 Parse 메서드 내의 해당 루프 이후.치료에서 Yelp API를 인증하는 방법은 무엇입니까? Secret_Token과 Search 매개 변수를 전달 하시겠습니까?

문제는 작동하지 않는다는 것입니다.) 로그가 첨부되었습니다. 나는 매개 변수와 비밀 토큰을 올바르게 전달하는지 궁금하다. 어떻게 메타에 비밀 토큰을 전달할 수 있을까? enter image description here

import scrapy 
import json 
import requests 
import pprint 



class YelpSpider(scrapy.Spider): 
    name = "yelp" 
    allowed_domains = ["https://api.yelp.com"] 

    def start_requests(self): 
     params = { 
      'grant_type': 'client_credentials', 
      'client_id': '*******', 
      'client_secret' : '*******' 
     } 

     request = requests.post('https://api.yelp.com/oauth2/token', params = params) 



     bearer_token = request.json()['access_token'] 
     headers = {'Authorization' : 'Bearer %s' % bearer_token} 

     params = { 
        'term': 'restaurant', 
        'offset': 20, 
        'cc' : 'AU', 
        'location': 4806 
       } 

     yield scrapy.Request('https://api.yelp.com/v3/businesses/search', headers = headers, cookies = params, callback= self.parse) 







    def parse(self, response): 
     item = response.json()['businesses'] 
     return item 

답변

0

예, 완전히 scrapy이 작업을 수행 할 수 있지만,이 yeld developers documentation에 지정된대로 대신 당신이 직접 요청을 할 필요가, API 클라이언트로 파이썬 라이브러리를 사용하지 않습니다.

0

다음은 Yelp Fusion API와 Scrapy를위한 완전한 기능 코드입니다. 나는 우편 번호와 오프셋 매개 변수를 기반으로 URL 생성 로직을 구현하여 최대 1000 개의 항목을 표시합니다. 플러스 항목을 구현합니다. 코드를 개선하는 방법에 대한 권장 사항이있을 경우에 대비하여 의견을 게시하십시오.

P. 그런데 퓨전 API는 결과를 50으로 표시하는 한계가 커졌습니다. 이제 사용 가능합니다. 'limit' : 50, 'offset': 50,

# -*- coding: utf-8 -*- 
import scrapy 
import json 

import urllib 

class YelpSpider(scrapy.Spider): 


name = "yelp" 


    def start_requests(self): 

     # as per Yelp docs we pass personal info as POST to get access_token 
     # here a pass it to different function as do not know how to to all in one 
     params = { 
      'grant_type': 'client_credentials', 
      'client_id': '**********', 
      'client_secret' : '************' 
     } 

     yield scrapy.Request(url='https://api.yelp.com/oauth2/token', method="POST", body=urllib.urlencode(params)) 




    def parse(self, response): 

     # revoke access token from response object. and set Header according to Yelp docs. 
     bearer_token = json.loads(response.body)['access_token'] 
     headers = {'Authorization' : 'Bearer %s' % bearer_token} 

     # set search parameters 
     params = { 
        'term': 'restaurant', 
        'offset': 20, 
        'cc' : 'AU', 
        'location': 4806 
       } 
     # base search URL for Fusion API 
     url = "https://api.yelp.com/v3/businesses/search" 

     # form Get request to recieve final info as JSON. Unfortunately I did not find appropriate 
     # method to pass params in Scrapy other then shown below. 

     yield scrapy.Request(url= url + '?' + urllib.urlencode(params), method="GET", headers=headers, callback=self.parse_items) 




    def parse_items(self, response): 

     # parse needed items. 

     resp = json.loads(response.body)['businesses'] 
     print resp