在具有此语法的所有页面上的scrapy废料

时间:2014-01-16 19:13:03

标签: python python-2.7 scrapy

我想在所有具有此语法合成的页面上进行scrapy

mywebsite/?page=INTEGER

我试过了:

start_urls = ['MyWebsite']
rules = [Rule(SgmlLinkExtractor(allow=['/\?page=\d+']), 'parse')]

但似乎链接仍为MyWebsite。所以,我应该怎么做才能让它明白我想添加/?page=NumberOfPage?请?

修改

我的意思是我要删除这些页面:

mywebsite/?page=1
mywebsite/?page=2
mywebsite/?page=3
mywebsite/?page=4
mywebsite/?page=5
..
..
..
mywebsite/?page=7677654

我的代码

start_urls = [
        'http://example.com/?page=%s' % page for page in xrange(1,100000)
    ]
def parse(self, response):
    sel = Selector(response)
    sites = sel.xpath('my xpath')
    for site in sites:

        DateDifference= site.xpath('xpath for date difference').extract()[0]

        if DateDifference.days < 8:
            yield Request(Link, meta={'date': Date}, callback = self.crawl)

我想获取过去7天内添加的所有网页数据。我不知道在过去7天内添加了多少页。所以我认为我可以爬上大量的页面,比方说100000,然后我检查datedifference如果它少于7天我想yield如果不是我想停止爬行所有

2 个答案:

答案 0 :(得分:1)

如果我说得对,你想抓取所有不到7天的网页。 一种方法是按顺序跟踪每一页(假设页面n°1是最小的,n°2早于n°1,n°3早于n°2 ......)。

您可以执行类似

的操作
start_urls = ['mywebsite/?page=1']

def parse(self, response):
    sel = Selector(response)
    DateDifference= sel.xpath('xpath for date difference').extract()[0]

    i = response.meta['index'] if 'index' in response.meta else 1

    if DateDifference.days < 8:
        yield Request(Link, meta={'date': Date}, callback = self.crawl)
        i += 1
        yield Request('mywebsite/?page='+str(i), meta={'index':i}, callback=self.parse)

我们的想法是按顺序执行parse。如果这是您第一次输入函数,则未定义response.meta['index']:索引为1.如果这是我们已经解析了另一个页面后的调用,则定义response.meta['index']:索引指示当前页面的编号。

答案 1 :(得分:0)

带有规则的

CrawlSpider在这种情况下无济于事。规则用于从第一页中提取与您的模式匹配的链接。显然,您的启动网页没有指向所有这些网页的链接,这就是您无法获取这些网页的原因。

这样的事情应该有效:

class MyWebsiteSpider(Spider):
    ...

    def start_requests(self):
        for i in xrange(7677654):
            yield self.make_requests_from_url('mywebsite/?page=%d' % i)