首页 > 解决方案 > 如果已经存在内容 ID,python scrapy 最好的方法是不重新抓取

问题描述

下面是爬取结果,如何防止基于seller_id的重复?目前,我浏览页面和页面,但希望获得基于 ID 的唯一结果。如果它在上次抓取的页面中看到相同的 Seller_id,请不要再次抓取。

{"name": "aaa", "seller_id": "1111", "seller_url": "/s-seller/aaa/1111/date/1"},
{"name": "bbb", "seller_id": "5555", "seller_url": "/s-seller/bbb/5555/date/1"},
{"name": "aaa", "seller_id": "1111", "seller_url": "/s-seller/aaa/1111/date/1"},

以下是我到目前为止所拥有的,如您所见,我确实有 if int(clean_total_ads) > 500 仅过滤超过 500+ 的广告并显示在结果中,但我还需要过滤唯一的 Seller_ID

def parse(self, response):
    sel = Selector(response)
    for link in sel.xpath("//*[contains(@href, '/aaaad/')]"):
        ad_link = link.css('a::attr(href)').extract_first()
        absolute_url = self.home_url + ad_link
        yield response.follow(absolute_url, self.parse_each_ad)


def parse_each_ad(self, response):
    def extract_with_css(query):
        return response.css(query).extract_first()

    total_ads = remove_tags(extract_with_css('span.seller-profile__number-of-ads'))
    clean_total_ads = re.sub('[^0-9]', '', total_ads)
    name = remove_tags(extract_with_css('span.seller'))
    seller_id_raw = extract_with_css('div.seller a::attr(href)')
    seller_id_compile = re.compile('.*\/(\d+)\/.*')
    seller_id_match = seller_id_compile.match(seller_id_raw).group(1)


    if int(clean_total_ads) > 500:
        yield {
            'name': name,
            'seller_id': seller_id_match,
            'seller_url': seller_id_raw,


             }

标签: pythonscrapy

解决方案


Scrapy 实际上自动管理重复爬取。如果你想明确地这样做,你可以试试这个:

class YourSpider(scrapy.Spider):
    name = 'your_spider'
    crawled_ids = set()
...
def parse(self, response):
    ...
    if seller_id not in self.crawled_ids:
        self.crawled_ids.add(seller_id)
        yield request

推荐阅读