【问题标题】:Quickly mass scrape Facebook fan pages' numeric IDs [closed]快速大量抓取 Facebook 粉丝页面的数字 ID [关闭]
【发布时间】:2014-01-10 22:28:40
【问题描述】:

许多 Facebook 粉丝页面现在采用以下格式 - https://www.facebook.com/TiltedKiltEsplanade 其中“TiltedKiltEsplanade”是页面所有者声称的名称示例。但是,同一页面的 RSS 提要位于 https://www.facebook.com/feeds/page.php?id=414117051979234&format=rss20,其中 414117051979234 是一个 ID,可以通过转到 https://graph.facebook.com/TiltedKiltEsplanade 并查找最后一个数字 ID 来确定列在页面上(页面顶部有两个外观相似的 ID,但可以忽略)。

我有一长串上述格式的 Facebook 粉丝页面,我想快速获取与这些页面对应的数字 ID,以便将它们全部添加到 RSS 阅读器。抓取这些页面的最简单方法是什么?我熟悉 Scrapy,但我不确定它是否可以使用,因为页面的图形版本没有以易于抓取的方式标记(据我所知)

谢谢。

【问题讨论】:

  • What would be the simplest way to scrape these pages? 可能有一些代码!我建议您检查一下 - stackoverflow.com/help/how-to-ask - 如果您遇到更具体的问题,请在您完成一些研究并开始自己编写代码之后返回。
  • 我了解 Python 的基础知识,并且以前使用过 Scrapy 来抓取网站,但鉴于代码的标记,我不确定它是否可以用于这个项目。我应该在我原来的问题中更具体。
  • 如果有人可以查看以 graph 开头的 URL 并查看是否有办法在 Scrapy 中对其进行编码,我真的很喜欢它。我不需要为我完成编码。我只想指出正确的方向。

标签: python facebook facebook-graph-api scrapy scrape


【解决方案1】:

图形请求的输出是一个 JSON 对象。这比 HTML 内容更容易处理。

这将是您正在寻找的简单实现:

# file: myspider.py
import json

from scrapy.http import Request
from scrapy.spider import BaseSpider


class MySpider(BaseSpider):
    name = 'myspider'
    start_urls = (
        # Add here more urls. Alternatively, make the start urls dynamic
        # reading them from a file, db or an external url.
        'https://www.facebook.com/TiltedKiltEsplanade',
    )

    graph_url = 'https://graph.facebook.com/{name}'
    feed_url = 'https://www.facebook.com/feeds/page.php?id={id}&format=rss20'

    def start_requests(self):
        for url in self.start_urls:
            # This assumes there is no trailing slash
            name = url.rpartition('/')[2]
            yield Request(self.graph_url.format(name=name), self.parse_graph)

    def parse_graph(self, response):
        data = json.loads(response.body)
        return Request(self.feed_url.format(id=data['id']), self.parse_feed)

    def parse_feed(self, response):
        # You can use the xml spider, xml selector or the feedparser module
        # to extract information from the feed.
        self.log('Got feed: %s' % response.body[:100])

输出:

$ scrapy runspider myspider.py
2014-01-11 02:19:48-0400 [scrapy] INFO: Scrapy 0.21.0-97-g21a8a94 started (bot: scrapybot)
2014-01-11 02:19:48-0400 [scrapy] DEBUG: Optional features available: ssl, http11, boto, django
2014-01-11 02:19:48-0400 [scrapy] DEBUG: Overridden settings: {}
2014-01-11 02:19:49-0400 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2014-01-11 02:19:49-0400 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2014-01-11 02:19:49-0400 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2014-01-11 02:19:49-0400 [scrapy] DEBUG: Enabled item pipelines: 
2014-01-11 02:19:49-0400 [myspider] INFO: Spider opened
2014-01-11 02:19:49-0400 [myspider] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2014-01-11 02:19:49-0400 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2014-01-11 02:19:49-0400 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2014-01-11 02:19:49-0400 [myspider] DEBUG: Crawled (200) <GET https://graph.facebook.com/TiltedKiltEsplanade> (referer: None)
2014-01-11 02:19:50-0400 [myspider] DEBUG: Crawled (200) <GET https://www.facebook.com/feeds/page.php?id=414117051979234&format=rss20> (referer: https://graph.facebook.com/TiltedKiltEsplanade)
2014-01-11 02:19:50-0400 [myspider] DEBUG: Got feed: <?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0"
          xmlns:media="http://search.yahoo.com
2014-01-11 02:19:50-0400 [myspider] INFO: Closing spider (finished)
2014-01-11 02:19:50-0400 [myspider] INFO: Dumping Scrapy stats:
    {'downloader/request_bytes': 578,
     'downloader/request_count': 2,
     'downloader/request_method_count/GET': 2,
     'downloader/response_bytes': 6669,
     'downloader/response_count': 2,
     'downloader/response_status_count/200': 2,
     'finish_reason': 'finished',
     'finish_time': datetime.datetime(2014, 1, 11, 6, 19, 50, 849162),
     'log_count/DEBUG': 9,
     'log_count/INFO': 3,
     'request_depth_max': 1,
     'response_received_count': 2,
     'scheduler/dequeued': 2,
     'scheduler/dequeued/memory': 2,
     'scheduler/enqueued': 2,
     'scheduler/enqueued/memory': 2,
     'start_time': datetime.datetime(2014, 1, 11, 6, 19, 49, 221361)}
2014-01-11 02:19:50-0400 [myspider] INFO: Spider closed (finished)

【讨论】:

  • 非常感谢您的帮助。我真诚地感谢您实际上为我创建了整个代码结构,因为我知道我需要很长时间才能弄清楚。当我尝试使用此代码将结果输出到 CSV 时 - scrapy crawl myspider -o FB.csv -t csv - 结果文件为空。你能帮我弄清楚我做错了什么吗?
  • @zgall1 你返回的是一个 Item 对象吗?我建议创建一个新问题,添加有关您的蜘蛛代码、输出日志等的更多详细信息。
  • 我只是运行了您提供的代码。现在我更仔细地查看它,我发现它没有返回 Item 对象(就像我之前创建的代码一样)。我会看看我是否可以修改你所做的。谢谢。
  • 搞定了。再次感谢。
猜你喜欢
  • 2013-04-26
  • 2023-03-07
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多