2
回答

标题的表述可能比较难理解,就是我在我要抓取dhgate.com的全部衣服类商品的数据,但在递归抓取下一页链接时遇到点问题。
比如所抓取这个商品展示页下的列出来的商品链接,以及下一页的的链接,最终获得这个分类的商品的数据。
但这个网站有个bug,比如说上面wholesale的分类,当下一页的链接到200的时候,也就是url后面的分页数字>=199的(c014031016001-199.html)时候,商品展示页的内容就会不和199页的完全一样,但是分页却可以继续!!!!,我的小spider会一直抓取下一页的链接,但却不能再抓取到新的商品,不陷入无限循环。
知道scrapy的DEPTH_LIMIT可以设置爬取的深度,但并不是每个分类页都只有199个商品页,所有觉得这不是最好的解决方法。
对scrapy的判重机制不是很了解,觉得可以从这方面入手,还请有经验的大神给点意见。
这是爬虫的一个test文件,
from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.contrib.loader import ItemLoader from scrapy.selector import Selector from cooka.items import DmozItem from scrapy.http import Request #import sys #sys.stdout=open('output.txt','w') class OtherSpider(CrawlSpider): name = "test" allowed_domains = ["dhgate.com"] start_urls = ["http://www.dhgate.com/wholesale/casual-dresses/c014031016001-199.html", ] link_extractor = { 'next_page': SgmlLinkExtractor(allow=('/who.*?.html'),restrict_xpaths=('//a[@class="next"]')), 'pro_link': SgmlLinkExtractor(allow=('/product/')), } def parse(self, response): for link in self.link_extractor['next_page'].extract_links(response): yield Request(url = link.url, callback=self.parse) for link in self.link_extractor['pro_link'].extract_links(response): yield Request(url = link.url, callback=self.myparse) def myparse(self, response): hxs = Selector(response) items =[] item = DmozItem() item['title'] = hxs.xpath('//h1[@itemprop="name"]/text()').extract() item['link'] = response.url item['desc'] = hxs.xpath('//h2[@class="shortdes"]/text()').extract() item['cate'] = hxs.xpath('//div[@class="wholesale-resources"]/h2/text()').extract() items.append(item) return items
运行结果:
前期可以抓到数据:
后期就只抓链接了,不过也可以确定scarp是有进行判重的。
希望得到一种解决方案,是在遇到有重复页面时候,就停止当前url的递归抓取,因为需求是要抓取多个目录的商品,希望高人给点指导,先谢过了。