我正在用scrapy写一个蜘蛛来抓取一个网站,索引页面是一个链接列表 www.link1.com,www.link2.com,www.link3.com 并且该网站经常更新,因此我的抓取工具是运行时间很长的进程的一部分,但我想只抓取我尚未抓取的新链接。 我的问题是scrapy随机化了它在深入时对待每个链接的方式。 是否有可能强制sracpy按顺序爬行?比如1然后是2然后是3,这样我就可以保存我抓取的最后一个链接,再次启动进程时只需将链接1与以前的链接1进行比较?
希望这是可以理解的,抱歉我的英语很差,
友好的回应,
谢谢
编辑:
class SymantecSpider(CrawlSpider):
name = 'symantecSpider'
allowed_domains = ['symantec.com']
start_urls = [
'http://www.symantec.com/security_response/landing/vulnerabilities.jsp'
]
rules = [Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="mrgnMD"]/following-sibling::table')), callback='parse_item')]
def parse_item(self, response):
open("test.t", "ab").write(response.url + "\n")
答案 0 :(得分:3)
试试这个例子。
构建一个列表并附加所有链接
然后逐个弹出它们以按顺序获取您的请求。
我建议做一些像@Hassan提及的事情并将你的内容传送到数据库。
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from scrapy import log
class SymantecSpider(BaseSpider):
name = 'symantecSpider'
allowed_domains = ['symantec.com']
allLinks = []
base_url = "http://www.symantec.com"
def start_requests(self):
return [Request('http://www.symantec.com/security_response/landing/vulnerabilities.jsp', callback=self.parseMgr)]
def parseMgr(self, response):
# This grabs all the links and append them to allLinks=[]
self.allLinks.append(HtmlXPathSelector(response).select("//table[@class='defaultTableStyle tableFontMD tableNoBorder']/tbody/tr/td[2]/a/@href").extract())
return Request(self.base_url + self.allLinks[0].pop(0), callback=self.pageParser)
# Cycle through the allLinks[] in order
def pageParser(self, response):
log.msg('response: %s' % response.url, level=log.INFO)
return Request(self.base_url + self.allLinks[0].pop(0), callback=self.pageParser)
答案 1 :(得分:1)
SgmlLinkExtractor将按照它们在页面上显示的顺序提取链接。
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
links = SgmlLinkExtractor(
restrict_xpaths='//div[@class="mrgnMD"]/following-sibling::table',
).extract_links(response)
您可以在CrawlSpider的rules
中使用它们:
class ThreatSpider(CrawlSpider):
name = 'threats'
start_urls = [
'http://www.symantec.com/security_response/landing/vulnerabilities.jsp',
]
rules = (Rule(SgmlLinkExtractor(
restrict_xpaths='//div[@class="mrgnMD"]/following-sibling::table')
callback='parse_threats'))