经过多次阅读Scrapy文档,我仍然没有捕捉到使用CrawlSpider规则和在回调方法上实现我自己的链接提取机制之间的区别。以下链接,Scrapy网页爬虫框架
我正在写一个使用后一种方法的新网络爬虫,但是因为我在使用规则的过去项目中遇到了不好的经历。我真的很想知道我在做什么以及为什么。
任何人都熟悉这个工具?
感谢您的帮助!
经过多次阅读Scrapy文档,我仍然没有捕捉到使用CrawlSpider规则和在回调方法上实现我自己的链接提取机制之间的区别。以下链接,Scrapy网页爬虫框架
我正在写一个使用后一种方法的新网络爬虫,但是因为我在使用规则的过去项目中遇到了不好的经历。我真的很想知道我在做什么以及为什么。
任何人都熟悉这个工具?
感谢您的帮助!
CrawlSpider继承BaseSpider。它只是添加了规则来提取和跟踪链接。 如果这些规则是不够灵活的你 - 使用BaseSpider:
class USpider(BaseSpider):
"""my spider. """
start_urls = ['http://www.amazon.com/s/?url=search-alias%3Dapparel&sort=relevance-fs-browse-rank']
allowed_domains = ['amazon.com']
def parse(self, response):
'''Parse main category search page and extract subcategory search link.'''
self.log('Downloaded category search page.', log.DEBUG)
if response.meta['depth'] > 5:
self.log('Categories depth limit reached (recursive links?). Stopping further following.', log.WARNING)
hxs = HtmlXPathSelector(response)
subcategories = hxs.select("//div[@id='refinements']/*[starts-with(.,'Department')]/following-sibling::ul[1]/li/a[span[@class='refinementLink']]/@href").extract()
for subcategory in subcategories:
subcategorySearchLink = urlparse.urljoin(response.url, subcategorySearchLink)
yield Request(subcategorySearchLink, callback = self.parseSubcategory)
def parseSubcategory(self, response):
'''Parse subcategory search page and extract item links.'''
hxs = HtmlXPathSelector(response)
for itemLink in hxs.select('//a[@class="title"]/@href').extract():
itemLink = urlparse.urljoin(response.url, itemLink)
self.log('Requesting item page: ' + itemLink, log.DEBUG)
yield Request(itemLink, callback = self.parseItem)
try:
nextPageLink = hxs.select("//a[@id='pagnNextLink']/@href").extract()[0]
nextPageLink = urlparse.urljoin(response.url, nextPageLink)
self.log('\nGoing to next search page: ' + nextPageLink + '\n', log.DEBUG)
yield Request(nextPageLink, callback = self.parseSubcategory)
except:
self.log('Whole category parsed: ' + categoryPath, log.DEBUG)
def parseItem(self, response):
'''Parse item page and extract product info.'''
hxs = HtmlXPathSelector(response)
item = UItem()
item['brand'] = self.extractText("//div[@class='buying']/span[1]/a[1]", hxs)
item['title'] = self.extractText("//span[@id='btAsinTitle']", hxs)
...
即使BaseSpider的start_urls不够灵活的你,覆盖start_requests方法。
如果您想要选择性抓取,比如抓取分页等的“下一步”链接,最好编写自己的抓取工具。但是对于一般抓取,您应该使用爬网搜索器并使用规则& process_links函数筛选出不需要遵循的链接。
看一看在\scrapy\contrib\spiders\crawl.py
的抓取器代码,它不是很复杂。
就在当场!其实我忘了提及我打算按照“下一步”链接!感谢您的参考。 – romeroqj
非常感谢!我没有提到我在爬行亚马逊,所以你给了和非常有用的资源:D。 亚马逊有一些URL包含一个哈希字符,而Scrapy会从该哈希标记剥离URL到最后。你是否有办法修改这种行为并保留整个URL? T.I.A,感谢您的帮助。 – romeroqj
剥离在哪里?在request.url中,xpath选择器还是? – warvariuc
如果您不介意检查,我会为此创建一个新线程。 http://stackoverflow.com/questions/6604690/scrapy-hash-tag-on-urls – romeroqj