Skip to main content
 首页 » 编程设计

python之无法从服务器端检索搜索结果 : Facebook Graph API using Python

2025年05月04日8sky-heaven

我正在自己做一些简单的 Python + FB Graph 训练,我遇到了一个奇怪的问题:

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 

我在这里要做的是自动翻阅搜索结果, 但尝试 content["paging"]["next"]

但是奇怪的是没有返回任何数据;我收到了以下内容:

{"data":[]} 

即使在第一个循环中也是如此。

但是当我将网址复制到浏览器中时,返回了很多结果。

我也尝试过使用我的访问 token 的版本,同样的事情发生了。

++++++++++++++++++++编辑和简化++++++++++++++++++

好的,感谢 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 在浏览器中会产生大量数据?

请您参考如下方法:

使用 Chrome(我得到大量数据)和 Firefox(我得到空响应)的试验和错误使我在“接受语言” header 上为零。其他修改据说只是装饰性的,但我不确定 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"')