3

我正在用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")
4

2 回答 2

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)
于 2012-07-26T21:43:27.430 回答
1

SgmlLinkExtractor 将按照它们出现在页面上的相同顺序提取链接。

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
links = SgmlLinkExtractor(
    restrict_xpaths='//div[@class="mrgnMD"]/following-sibling::table',
        ).extract_links(response)

您可以rules在 CrawlSpider 中使用它们:

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'))
于 2012-07-26T19:04:32.497 回答