如何抓取多个 RSS 提要并将结果分别存储在它们的 CSV 中?

How to scrape multiple RSS feeds and store results respectively in their CSVs?

有没有一种方法可以从多个 RSS 提要中抓取数据并存储结果?

我正在从多个 RSS 提要中抓取数据,并以最糟糕的方式将它们分别存储在它们的 CSV 中——将每个提要的 .py 文件分开到它们的 CSV 中,并 运行将所有 .py 文件放在文件夹。

我在一个文件夹中有多个这样的 py 文件,只有 url 不同。我不确定如何 运行 它们循环并将结果存储在各自的 CSV 文件中

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'anyRSSFeedLink.com'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html.parser')

output = []
for entry in soup.find_all('entry'):

    item = {
        'Title': entry.find('title', {'type': 'html'}).text,
        'Pubdate': entry.find('published').text,
        'Content': entry.find('content').text,
        'Link': entry.find('link')['href']
    }

    output.append(item)


df = pd.DataFrame(output)

df.to_csv('results/results_feed01.csv', index=False)

如何从包含所有 RSS 提要链接的 CSV 中读取,如下所示:

和 运行 它们在一个单独的抓取文件中,同时存储在它们各自结果的 CSV 中,看起来像这样?

Is there a way one can scrape data from multiple RSS feeds and store results?

是的 - 只需将您的网址读入列表或直接遍历 csv 中的每一行。

feeds = ['http://feeds.bbci.co.uk/news/rss.xml','http://www.cbn.com/cbnnews/us/feed/']

for url in feeds:
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, 'xml')

    output = []
    for entry in soup.find_all('item'):

        item = {
            'Title': entry.find('title').text,
            'Pubdate': e.text if(e := entry.find('pubDate')) else None,
            'Content': entry.find('description').text,
            'Link': entry.find('link').text
        }

        output.append(item)

在每次迭代中,您都会抓取提要并将其保存到它的 csv 中,例如可以按域命名,...

 df.to_csv(f'results_feed_{url.split("/")[2]}.csv', index=False)

如果您愿意,也可以使用计数器:

for enum, url in enumerate(feeds):
    ...
    df.to_csv(f'results_feed{enum}.csv', index=False)

注意 - 这仅在所有提要都遵循相同结构的情况下才有效,否则您必须进行一些调整。在调用方法或属性之前,您还应该检查您尝试查找的元素是否可用:

'Pubdate': e.text if(e := entry.find('pubDate')) else None

例子

import requests
from bs4 import BeautifulSoup
import pandas as pd

feeds = ['http://feeds.bbci.co.uk/news/rss.xml','http://www.cbn.com/cbnnews/us/feed/']

for url in feeds:
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, 'xml')

    output = []
    for entry in soup.find_all('item'):

        item = {
            'Title': entry.find('title').text,
            'Pubdate': e.text if(e := entry.find('pubDate')) else None,
            'Content': entry.find('description').text,
            'Link': entry.find('link').text
        }

        output.append(item)


    df = pd.DataFrame(output)

    df.to_csv(f'results_feed_{url.split("/")[2]}.csv', index=False)

output = [] 一定要跳出循环,否则你的结果只会是最后的url。如果你检查你的 cdv 文件,你将只有 cbnnews 的提要。结果会被压垮。

代码应该是:

import requests
from bs4 import BeautifulSoup
import pandas as pd

feeds = ['http://feeds.bbci.co.uk/news/rss.xml','http://www.cbn.com/cbnnews/us/feed/']

output = []

for url in feeds:
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, 'xml')

    for entry in soup.find_all('item'):

        item = {
            'Title': entry.find('title').text,
            'Pubdate': e.text if(e := entry.find('pubDate')) else None,
            'Content': entry.find('description').text,
            'Link': entry.find('link').text
        }

        output.append(item)


    df = pd.DataFrame(output)

    df.to_csv(f'results_feed_{url.split("/")[2]}.csv', index=False)

现在,如果您检查您的 cdv 文件,您将拥有两个 url 供稿。