到达上一运行的起点时如何阻止草木爬网

时间:2018-09-26 07:57:57

标签: python scrapy

我正在制作一个蜘蛛,它将在第一次运行时爬网整个站点并将数据存储在我的数据库中。

但是我将继续每周运行一次Spider以获取数据库中已爬网站点的更新,并且我不想让我抓取来抓取数据库中已经存在的页面如何实现这一目标,我做了两个计划-

1]制作一个搜寻器以获取整个网站,并以某种方式将第一个获取的URL存储在csv文件中,然后继续关注下一页。然后制作另一个爬网程序,它将开始向后获取,这意味着它将从csv中的URL接收输入并继续运行,直到prev_page退出为止,这样我将获得数据,但是csv中的url将被爬网两次。

2]制作一个搜寻器,它将检查数据是否在数据库中,然后停止,这是否可行?这将是最有效的方法,但我找不到出路。也许制作日志文件可能会有所帮助?

更新 该网站是一个博客,经常更新,并以最新方式列为最新帖子

1 个答案:

答案 0 :(得分:1)

类似的东西:

from scrapy import Spider
from scrapy.http import Request, FormRequest



class MintSpiderSpider(Spider):

    name = 'Mint_spider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/']

    def parse(self, response):
        urls =  response.xpath('//div[@class = "post-inner post-hover"]/h2/a/@href').extract()

        for url in urls:
            if never_visited(url, database):
                yield Request(url, callback=self.parse_lyrics) #do you mean parse_foo ?

        next_page_url = response.xpath('//li[@class="next right"]/a/@href').extract_first()
        if next_page_url:
            yield scrapy.Request(next_page_url, callback=self.parse)


    def parse_foo(self, response):
        save_url(response.request.url, database)
        info = response.xpath('//*[@class="songinfo"]/p/text()').extract()
        name =  response.xpath('//*[@id="lyric"]/h2/text()').extract()

        yield{
            'name' : name,
            'info': info
        }

您只需要实现never_visited和save_url函数。 never_visited将在数据库中检入url是否已存在。 save_url会将网址添加到您的数据库中。