嗨,我只想抓取lastmod
日期比特定日期新的页面。
例如:仅在lastmod
为14/9/2017或更高版本时才刮URL。
我使用以下代码来刮取所有页面,但不能基于lastmod
日期对其进行限制:
import requests
from scrapy.spiders import SitemapSpider
from urllib.parse import urljoin
class MySpider(SitemapSpider):
name = 'sitemap_spider'
robots_url = 'http://www.example.org/robots.txt'
sitemap_urls = [robots_url]
sitemap_follow = ['products-eg-ar']
def parse(self, response):
print(response.url)
这是我的
robots.txt
sitemap: /sitemap-products-eg-ar-index-1-local.xml
sitemap-products-eg-ar-index-1-local.xml
包含:<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>/sitemap-products-eg-ar-1.xml</loc>
</sitemap>
<sitemap>
<loc>/sitemaps/sitemap-products-eg-ar-2.xml</loc>
</sitemap>
</sitemapindex>
sitemap-products-eg-ar-2.xml
包含:<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>/product-8112041/i/</loc>
<priority>0.8</priority>
<lastmod>2017-06-17</lastmod>
<changefreq>daily</changefreq>
</url>
</urset>
最佳答案
对于标准SitemapSpider
类,这是不可能的。您必须将其子类化,并修改其处理_parse_sitemap
的urlset
方法。由于此方法在内部使用iterloc
模块中的sitemap
函数,因此更肮脏的解决方案是重新定义该函数以考虑到lastmod
元素。像这样:
import datetime
import scrapy
oldest = datetime.datetime.strptime('2017-09-14', '%Y-%m-%d')
def _iterloc(it, alt=False):
for d in it:
lastmod = datetime.datetime.strptime(d['lastmod'], '%Y-%m-%d')
if lastmod > oldest:
yield d['loc']
# Also consider alternate URLs (xhtml:link rel="alternate")
if alt and 'alternate' in d:
for l in d['alternate']:
yield l
scrapy.spiders.sitemap.iterloc = _iterloc
# your spider code here
关于python - 如果网址比lastmod日期新,请搜寻网址-Scrapy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46235834/