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}

" + (f"" 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()