2017-09-15 2 views
1

안녕하세요, lastmod이 (가) 특정 날짜보다 새로운 페이지 만 긁고 싶습니다.lastmod 날짜보다 새로운 경우 스크랩 URL -Scrap

예 : 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> 

답변

1

표준 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