Feed Seeker
It slant rhymes with “heat seeker”
A library for finding atom, rss, rdf, and xml feeds from web pages. Produced at the mediacloud project. An incremental improvement over feedfinder2, which was itself based on feedfinder, written by Mark Pilgrim, and maintained by Aaron Swartz until his untimely death.
Installation
The library is available on PyPI:
pip install feed_seeker
The library requires Python 3.5+.
Quickstart
By default, the library uses requests to grab html and inspect it and find the most
likely feed url:
from feed_seeker import find_feed_url
>>> find_feed_url('https://github.com/mitmedialab/feed_seeker')
'https://github.com/mitmedialab/feed_seeker/commits/master.atom'
To do a more thorough search, use generate_feed_urls, which returns more likely candidates first.
from feed_seeker import generate_feed_urls
>>> for url in generate_feed_urls('https://xkcd.com'):
... print(url)
...
https://xkcd.com/atom.xml
https://xkcd.com/rss.xml
For the most thorough search, add a spider argument to do depth-first spidering of urls on the same hostname. Note the below call takes nearly four minutes, compared to 0.5 seconds for find_feed_url.
>>> for url in generate_feed_urls('https://github.com/mitmedialab/feed_seeker', spider=1):
... print(url)
...
https://github.com/mitmedialab/feed_seeker/commits/master.atom,
https://github.com/mitmedialab/feed_seeker/commits/95cf320796c487df8b70f9c42281d8f26452cc31.atom,
https://github.com/mitmedialab/feed_seeker/commits/3e93490cb91f7652325c2fe41ef29a5be4558d6a.atom,
https://github.com/mitmedialab/feed_seeker/commits/659311b8853c4c4a67e3b4bc67a78461d825a064.atom,
https://github.com/mitmedialab/feed_seeker/commits/a8f7b86eac2cedd9209ac5d2ddcceb293d2404c9.atom,
https://github.com/index.atom,
https://github.com/articles.atom,
https://github.com/dfm/feedfinder2/commits/master.atom,
https://github.com/blog.atom,
https://github.com/blog/all.atom,
https://github.com/blog/broadcasts.atom,
https://github.com/ColCarroll.atom
New Feedly Support
Search Feedly to find relevant feeds to a specific site:
from feed_seeker import find_feedly_feeds
>>> for url in find_feedly_feeds('https://www.nytimes.com'):
... print(url)
...
http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml
http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml
http://www.nytimes.com/services/xml/rss/nyt/Science.xml
http://www.nytimes.com/services/xml/rss/nyt/Travel.xml
http://www.nytimes.com/services/xml/rss/nyt/Technology.xml
http://www.nytimes.com/services/xml/rss/nyt/Business.xml
In a hurry?
If you have a long list of urls, you might want to set a timeout with max_time:
>>> for url in ('https://httpstat.us/200?sleep=5000', 'https://github.com/mitmedialab/feed_seeker'):
... try:
... print('found feed:\t{}'.format(find_feed_url(url, max_time=3)))
... except TimeoutError:
... print('skipping {}'.format(url))
skipping https://httpstat.us/200?sleep=5000
found feed: https://github.com/mitmedialab/feed_seeker/commits/master.atom
Differences with feedfinder2
The biggest difference is that all functions are implemented as generators, and are evaluated lazily. Candidate feed links are actually accessed and inspected to determine whether or not they are a feed, which can be quite time consuming. We expose a function to find the most likely feed link, and another to lazily generate links in rough order from most prominent to least.
There are also a few more heuristics based on our experience at mediacloud.
Metadata
Release files for feed-seeker 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| feed_seeker-2.0.0.tar.gz | 10.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| feed_seeker-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.7 kB
Release files / feed_seeker-2.0.0.tar.gz
| Download URL | feed_seeker-2.0.0.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e03c9a33cb820aee63d31b1b85932205bf9b88ce8fe76e1ab7ee0322721153b8
|
|
BLAKE2b-256 checksum How to use checksums |
1e05963babd2a6e51f3df536e13a5a5a96c4ce829bcb30064bf1011b3bab6919
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.
Transparency logRelease files / feed_seeker-2.0.0-py3-none-any.whl
| Download URL | feed_seeker-2.0.0-py3-none-any.whl |
|---|---|
| Size | 10.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e02cc48c2931d6ae0aafdbe05459ce5c57a789399b8faa3f0c3c27b0b9f41a35
|
|
BLAKE2b-256 checksum How to use checksums |
4baa9cfb6cfd2087e34effb789bc0e9a3810c35213390601470e80e2703f3ddb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.
Transparency log