scrapy 2.3 SitemapSpider

2021-06-09 10:07 更新
classscrapy.spiders.SitemapSpider

SiteMapSpider允許您通過使用 Sitemaps .

它支持嵌套的站點地圖和從中發(fā)現(xiàn)站點地圖URL robots.txt .

sitemap_urls

指向要爬網(wǎng)其URL的網(wǎng)站地圖的URL列表。

您也可以指向 robots.txt 它將被解析為從中提取站點地圖URL。

sitemap_rules

元組列表 (regex, callback) 在哪里?

  • regex 是一個正則表達式,用于匹配從站點地圖中提取的URL。 regex 可以是str或已編譯的regex對象。

  • 回調是用于處理與正則表達式匹配的URL的回調。 callback 可以是字符串(指示spider方法的名稱)或可調用的。

例如::

sitemap_rules = [('/product/', 'parse_product')]

規(guī)則按順序應用,只使用第一個匹配的規(guī)則。

如果省略此屬性,則在站點地圖中找到的所有URL都將使用 parse 回調。

sitemap_follow

應遵循的站點地圖正則表達式列表。這只適用于使用 Sitemap index files 指向其他站點 Mapfile 。

默認情況下,將遵循所有站點地圖。

sitemap_alternate_links

指定是否為一個 url 應該遵循。這些是同一網(wǎng)站的鏈接,使用同一網(wǎng)站內傳遞的另一種語言 url 塊。

例如::

<url>
    <loc>http://example.com/</loc>
    <xhtml:link rel="alternate" hreflang="de"  rel="external nofollow" target="_blank" />
</url>

用 sitemap_alternate_links 設置,這將檢索兩個URL。用 sitemap_alternate_links 只有殘疾人 http://example.com/ 將被取回。

sitemap_alternate_links 殘疾人。

sitemap_filter(entries)

這是一個過濾器函數(shù),可以重寫該函數(shù)以根據(jù)其屬性選擇站點地圖條目。

例如::

<url>
    <loc>http://example.com/</loc>
    <lastmod>2005-01-01</lastmod>
</url>

我們可以定義一個 sitemap_filter 要篩選的函數(shù) entries 日期:

from datetime import datetime
from scrapy.spiders import SitemapSpider

class FilteredSitemapSpider(SitemapSpider):
    name = 'filtered_sitemap_spider'
    allowed_domains = ['example.com']
    sitemap_urls = ['http://example.com/sitemap.xml']

    def sitemap_filter(self, entries):
        for entry in entries:
            date_time = datetime.strptime(entry['lastmod'], '%Y-%m-%d')
            if date_time.year >= 2005:
                yield entry

這只能找回 entries 2005年及以后年份修改。

條目是從站點地圖文檔中提取的dict對象。通常,鍵是標記名,值是其中的文本。

重要的是要注意:

  • 由于loc屬性是必需的,因此不帶此標記的條目將被丟棄。

  • 備用鏈接用鍵存儲在列表中 alternate (見 sitemap_alternate_links )

  • 名稱空間被刪除,因此名為 {{namespace}}tagname 成為唯一 tagname

如果省略此方法,則將處理站點地圖中找到的所有條目,同時觀察其他屬性及其設置。

SiteMapSpider示例

最簡單的示例:使用 parse 回叫:

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/sitemap.xml']

    def parse(self, response):
        pass # ... scrape item here ...

使用特定回調處理某些URL,使用其他回調處理其他URL::

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/sitemap.xml']
    sitemap_rules = [
        ('/product/', 'parse_product'),
        ('/category/', 'parse_category'),
    ]

    def parse_product(self, response):
        pass # ... scrape product ...

    def parse_category(self, response):
        pass # ... scrape category ...

遵循中定義的站點地圖 robots.txt 文件,僅跟蹤其URL包含 /sitemap_shop ::

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/robots.txt']
    sitemap_rules = [
        ('/shop/', 'parse_shop'),
    ]
    sitemap_follow = ['/sitemap_shops']

    def parse_shop(self, response):
        pass # ... scrape shop here ...

將SiteMapSpider與其他URL源合并::

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/robots.txt']
    sitemap_rules = [
        ('/shop/', 'parse_shop'),
    ]

    other_urls = ['http://www.example.com/about']

    def start_requests(self):
        requests = list(super(MySpider, self).start_requests())
        requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]
        return requests

    def parse_shop(self, response):
        pass # ... scrape shop here ...

    def parse_other(self, response):
        pass # ... scrape other here ...
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號