2014-01-10 43 views
-1

許多Facebook粉絲頁面現在採用以下格式 - https://www.facebook.com/TiltedKiltEsplanade其中「TiltedKiltEsplanade」是頁面所有者聲明的名稱示例。但是,同一頁面的RSS源可在https://www.facebook.com/feeds/page.php?id=414117051979234&format=rss20處找到,其中414117051979234是一個ID,可以通過轉到https:// .facebook.com/TiltedKiltEsplanade並查找頁面上列出的最後一個數字ID來確定頁面頂部有兩個類似的ID,但這些可以忽略)。快速批量刮臉Facebook粉絲頁面的數字ID

我有一個很長的上述格式的Facebook粉絲頁面列表,我想快速獲取與這些頁面對應的數字ID,以便我可以將它們全部添加到RSS閱讀器。什麼是最簡單的方法來刮這些網頁?我熟悉Scrapy,但我不確定它是否可以使用,因爲頁面的圖形版本沒有標記爲允許輕鬆抓取(據我所知)

謝謝。

+0

'什麼是湊這些頁面的最簡單的方法'可能與一些代碼? !我建議您檢查一下 - http://stackoverflow.com/help/how-to-ask - 如果遇到更具體的問題,在您完成一些研究並開始自行編寫代碼後,請回頭。 – admdrew

+0

我瞭解Python的基礎知識,並曾使用Scrapy來刮取網站,但我不確定它是否可用於此項目,因爲代碼已標記。我原來的問題應該更具體一些。 – zgall1

+0

我真的很喜歡它,如果有人可以看看以圖開頭的URL並查看是否有方法在Scrapy中進行編碼。我不需要爲我完成的編碼。我只想指出正確的方向。 – zgall1

回答

4

圖請求的輸出是一個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) 
+0

非常感謝您的幫助。我真誠地感謝你,我確實爲我創建了完整的代碼結構,因爲我知道這將花費我很長時間才能弄清楚。 當我嘗試使用此代碼將結果輸出到CSV - scrapy抓取myspider -o FB.csv -t csv - 生成的文件爲空。你能幫我弄清楚我做錯了什麼嗎? – zgall1

+0

@ zgall1你是否正在返回一個Item對象?我建議創建一個新問題,添加有關您的蜘蛛代碼,輸出日誌等的更多細節。 – Rolando

+0

我只是運行您提供的代碼。現在我更仔細地看它,我發現它不返回一個Item對象(就像我之前創建的代碼)。我會看看我是否可以修改你所做的。謝謝。 – zgall1