python - 如果已经存在内容 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,
}
解决方案
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
推荐阅读
- ios - iOS 上的 Firebase 不返回新添加的条目
- javascript - Google Chrome、JQuery 和带有键的无法解释的事件行为
- google-cloud-datastore - Google Cloud Datastore、Python 客户端、add_filter 不返回任何结果
- javascript - 基于javascript中时间戳的范围之间的“随机”数
- javascript - 使用 Firebase 反应 Redux
- javascript - 通过 javaScript 显示动态饼图(只显示 for 循环中的最后一个)
- microcontroller - 如何为 STM32F4 微控制器的 flash bank 实现 OTA 更新故障转移场景?
- uwp - UWP RichEditBox ITextRange 有图像
- scala - 如何向演员akka发送消息
- php - WooCommerce prevent checkout until post code entered