2011-01-10 2 views
2
난 내 자신에 대한 몇 가지 간단한 파이썬 + FB 그래프 훈련을하고 있어요

를, 나는 이상한 문제에 직면 : 난 무엇서버 측에서 검색 결과를 검색 할 수 없습니다 : 페이스 북 그래프 API의 usig 파이썬

import time 
import sys 
import urllib2 
import urllib 
from json import loads 

base_url = "https://graph.facebook.com/search?q=" 
post_id = None 
post_type = None 
user_id = None 
message = None 
created_time = None 

def doit(hour): 
    page = 1 
    search_term = "\"Plastic Planet\"" 
    encoded_search_term = urllib.quote(search_term) 
    print encoded_search_term 
    type="&type=post" 
    url = "%s%s%s" % (base_url,encoded_search_term,type) 
    print url 
    while(1): 

     try: 
      response = urllib2.urlopen(url) 
     except urllib2.HTTPError, e: 
      print e 
     finally: 
      pass 

     content = response.read() 
     content = loads(content) 

     print "==================================" 
     for c in content["data"]: 
      print c 
      print "****************************************" 

     try: 
      content["paging"] 
      print "current URL" 
      print url 
      print "next page!------------" 
      url = content["paging"]["next"] 
      print url 
     except: 
      pass 
     finally: 
      pass 

     """ 
     print "new URL is =======================" 
     print url 
     print "==================================" 
     """ 
     print url 

검색 결과를 통해 자동으로 페이지를 검색하는 것입니다. [ "paging"] [ "next"]

그러나 이상한 것은 데이터가 반환되지 않는다는 것입니다. 나는 다음을 받았다 :

{"data":[]} 

아주 첫 번째 루프에서도.

하지만 URL을 브라우저에 복사하면 많은 결과가 반환됩니다.

나는 또한 내 액세스 토큰을 사용하여 버전을 시도했으며 같은 일이 발생합니다.

누구든지 나를 계몽시킬 수 있습니까?

+++++++++++++++++++ 편집하고 단순화 ++++++++++++++++++

TryPyPy에

확인 감사 , 여기에 내 이전 질문의 단순화 및 편집 된 버전입니다 :

이유는 다음과 같습니다.

import urllib2 
     url = "https://graph.facebook.com/searchq=%22Plastic+Planet%22&type=post&limit=25&until=2010-12-29T19%3A54%3A56%2B0000" 
     response = urllib2.urlopen(url) 
     print response.read() 

결과는 {"data":[]}입니까?

그러나 동일한 URL은 브라우저에 많은 양의 데이터를 생성합니까?

누구나?

좋습니다.

+0

확인을 재현 할 수 있었다. 내 질문에 단순화 할 수 있습니다 생각 : 왜'수입 urllib2; url = "https://graph.facebook.com/search?q=%22Plastic+Planet%22&type=post&limit=25&until=2010-12-29T19%3A54%3A56%2B0000"; 응답 = urllib2.urlopen (url); print response.read()'결과는'{ "data": []}'이지만 브라우저의 동일한 URL은 많은 출력을 제공합니까? – TryPyPy

+1

안녕하세요, 감사합니다. 나는 그 질문을 단순화했다. 그것에 대한 어떤 생각? – DjangoRocks

+0

나는 이것을 진단하는 행운이 없었지만, FB가 쿠키를 돌려주고있는 것을 보았다 ('print response.headers'). 어쩌면 두 개의 서로 다른 브라우저를 열 수 있습니다. 하나는 쿠키가 차단되고 다른 하나는 모두 허용 된 다음 새로 생성 된 URL을 가져 와서 쿠키 지원 부족이 원인인지 확인하는 것입니다. 나 자신을 테스트하지 않아서 미안해. – TryPyPy

답변

1

Chrome (데이터가 많은 곳)과 Firefox (빈 응답이있는 곳)를 사용하여 시행 착오를하면 'Accept-Language'헤더에서 제로가됩니다. 다른 수정은 아마도 화장품 일 뿐이지 만 CookieJar에 대해서는 잘 모르겠습니다.

import time 
import sys 
import urllib2 
import urllib 
from json import loads 
import cookielib 

base_url = "https://graph.facebook.com/search?q=" 
post_id = None 
post_type = None 
user_id = None 
message = None 
created_time = None 

jar = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar)) 
opener.addheaders = [ 
    ('Accept-Language', 'en-US,en;q=0.8'),] 

def doit(hour): 
    page = 1 
    search_term = "\"Plastic Planet\"" 
    encoded_search_term = urllib.quote(search_term) 
    print encoded_search_term 
    type="&type=post" 
    url = "%s%s%s" % (base_url,encoded_search_term,type) 

    print url 

    data = True 
    while data: 
     response = opener.open(url) 
     opener.addheaders += [ 
      ('Referer', url) ] 

     content = response.read() 
     content = loads(content) 

     print "==================================" 
     for c in content["data"]: 
      print c.keys() 
     print "****************************************" 

     if "paging" in content: 
      print "current URL" 
      print url 
      print "next page!------------" 
      url = content["paging"]["next"] 
      print url 
     else: 
      print content 
      print url 
      data = False 

doit(1) 

가 여기 청소, 최소한의 작업 버전입니다 :

import urllib2 
import urllib 
from json import loads 
import cookielib 

def doit(search_term, base_url = "https://graph.facebook.com/search?q="): 
    opener = urllib2.build_opener() 
    opener.addheaders = [('Accept-Language', 'en-US,en;q=0.8')] 

    encoded_search_term = urllib.quote(search_term) 
    type="&type=post" 
    url = "%s%s%s" % (base_url,encoded_search_term,type) 

    print encoded_search_term 
    print url 

    data = True 
    while data: 
     response = opener.open(url) 

     content = loads(response.read()) 

     print "==================================" 
     for c in content["data"]: 
      print c.keys() 
     print "****************************************" 

     if "paging" in content: 
      url = content["paging"]["next"] 
     else: 
      print "Empty response" 
      print content 
      data = False 

doit('"Plastic Planet"') 
+0

이봐, 작동!. Accept Language 헤더를 추가하여이 문제를 어떻게 해결했는지 궁금합니다. – DjangoRocks

+0

필자는 파이썬에서 데이터 부족으로 인해 차이가 있다고 생각했기 때문에 urllib2 오프너에 임의의 헤더를 추가하기 시작했습니다.그게 작동하지 않았기 때문에 Firefox를 열어 라이브 HTTP 헤더를 사용하고 모든 헤더를 복사했지만 파이어 폭스는 파이썬보다 더 많은 데이터를 보여주지 못했습니다. 그래서 Chrome의 Dev Tools를 사용하여 전송 한 헤더를 확인한 다음 FF의 라이브 HTTP 헤더에 각 헤더를 붙여 넣었습니다. 이때 FF에 많은 데이터가 포함될 때까지 Accept-Language가 발생했습니다. 파이썬에서 사용하는 것도 괜찮습니다. :) – TryPyPy

관련 문제