80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
import argparse
|
|
import logging
|
|
from facebook_scraper import get_posts
|
|
from rfeed import Item, Feed, Guid
|
|
import datetime
|
|
import os
|
|
|
|
# Configure logging
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
def scrape_facebook_page(page_name, pages_count=1):
|
|
"""
|
|
Scrapes the posts from a Facebook page.
|
|
"""
|
|
logging.info(f"Starting scrape for page: {page_name}")
|
|
posts_data = []
|
|
try:
|
|
# get_posts returns a generator
|
|
for post in get_posts(page_name, pages=pages_count):
|
|
posts_data.append(post)
|
|
except Exception as e:
|
|
logging.error(f"Error scraping page {page_name}: {e}")
|
|
|
|
logging.info(f"Retrieved {len(posts_data)} posts.")
|
|
return posts_data
|
|
|
|
def generate_rss(posts, page_name, output_file="feed.xml"):
|
|
"""
|
|
Generates an RSS feed from the scraped posts.
|
|
"""
|
|
items = []
|
|
for post in posts:
|
|
# Extract relevant data
|
|
post_id = post.get('post_id')
|
|
text = post.get('text') or "No text content"
|
|
post_url = post.get('post_url')
|
|
time = post.get('time')
|
|
image = post.get('image')
|
|
|
|
# Create RSS item
|
|
item = Item(
|
|
title=text[:60] + "..." if len(text) > 60 else text,
|
|
link=post_url,
|
|
description=f"{text}<br/><br/>" + (f"<img src='{image}'/>" if image else ""),
|
|
author=page_name,
|
|
guid=Guid(post_id),
|
|
pubDate=time
|
|
)
|
|
items.append(item)
|
|
|
|
feed = Feed(
|
|
title=f"{page_name} Facebook Feed",
|
|
link=f"https://www.facebook.com/{page_name}",
|
|
description=f"RSS feed for {page_name} Facebook page",
|
|
language="en-US",
|
|
lastBuildDate=datetime.datetime.now(),
|
|
items=items
|
|
)
|
|
|
|
with open(output_file, "w", encoding='utf-8') as f:
|
|
f.write(feed.rss())
|
|
logging.info(f"RSS feed written to {output_file}")
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Facebook to RSS Scraper")
|
|
parser.add_argument("page_name", help="Name or ID of the Facebook page")
|
|
parser.add_argument("--output", default="feed.xml", help="Output RSS file name")
|
|
parser.add_argument("--pages", type=int, default=1, help="Number of pages to scrape")
|
|
|
|
args = parser.parse_args()
|
|
|
|
posts = scrape_facebook_page(args.page_name, args.pages)
|
|
if posts:
|
|
generate_rss(posts, args.page_name, args.output)
|
|
else:
|
|
logging.warning("No posts found or scraping failed.")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|