Scrapy 按顺序爬取

0 投票
1 回答
1370 浏览
提问于 2025-04-18 15:29

我搞不清楚怎么让scrapy按顺序爬取链接。我有一个页面,上面有很多文章,每篇文章都有一个标题,但文章的内容和标题不匹配。另外,我在settings.py文件里添加了:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

我现在的情况大概是这样的:

class Getgot(Spider):
    name = "getem"
    allowed_domains = ["somesite.us"]
    start_urls = ["file:local.html"]
    el = '//div[@article]'


    def parse(self,response):
        hxs = HtmlXPathSelector(response)
        s = hxs.select('//article')
        filename = ("links.txt")
        filly = open(filename, "w")
        for i in s:
            t = i.select('a/@href').extract()
            filly.write(str(t[0])+'\n') 
            yield Request(str(t[0]),callback=self.parse_page)


    def parse_page(self,res):
        hxs = HtmlXPathSelector(res)
        s = hxs.select('//iframe').extract()
        if s:
            filename = ("frames.txt")
            filly = open(filename, "a")
            filly.write(str(s[0])+'\n') 
    else:
        filename = ("/frames.txt")
        filly = open(filename, "a")
        filly.write('[]\n') 

1 个回答

0

我不太明白你的问题和你的代码有什么关系。标题在哪里呢?

这里有几个小建议:1)把你的scrapy语法更新到最新版本;2)不要在爬虫里直接写文件,应该在管道中处理或者导出数据;3)如果你需要把数据从一个函数传到下一个函数,可以使用meta属性。

def parse(self, response):
    for link in response.xpath("//article/a/@href").extract():
        yield Request(link, callback=self.parse_page, meta={'link':link})

def parse_page(self, response):
    for frame in response.xpath("//iframe").extract():
        item = MyItem()
        item['link'] = response.meta['link']
        item['frame'] = frame
        yield item

然后你可以把它导出为csv、json或者其他格式,这样就可以把链接和框架一起存储起来。

撰写回答