scrapy 爬取多条数据(scrapy 列表爬取)

时间:2018-01-02 17:21作者:scrapy中文网阅读:

          上面的scrapy中文教程,我们利用上面的、上面的知识,也就是scrapy shell 、scrapy css选择器……终于爬取并保存了我们想要(当然你想不想要我们不知道)的一条结构化数据!似不似有点开心?但是革命尚未成功,努力还要继续,如果我们只会爬一条数据,还要scrapy干嘛?直接Ctrl+C、Ctrl+V就OK了,浪费表情!

          那接下来我们再接再厉,突破一条,我们要爬取多条,也就是把首页里面的都爬了!我们要实现神马效果呢,要不这样,我们把首页里面,每一个作家的名言都爬取了保存在一个txt里面,然后再用他的名字命名文件。有了目标我们就好干事了,就像你学爬虫一样,有的可能是为了爬没穿衣服的美女,有的是为了爬类似大型古典名著《金瓶梅》的连载小说,而我却是为了造福全人类……奔着以上的、以上的目的,我们看应该怎么做,做了个鬼画符,让诸君更直观的明白,我到底要带着你们干嘛,如下图:

scrapy 列表爬取

好了就是这么个意思,不明白上面文字的,看看这鬼画符,还不明白就去文章末尾下源码,跑一下就OK了!

这里的话,新的知识点木有什么,唯一多了个递归调用,我们来看一下关键变化,原先我们取出一条数据,用的是如下表达式:
mingyan = response.css('div.quote')[0]
我们在后面添加了游标 [0]  表示只取出第一条,那我们要取出全部,那我们就不用加了,直接:
mingyan = response.css('div.quote')
那现在的变量就是一个数据集,里面有多条数据了,那接下来我们要做的就是循环取出数据集里面的每一条数据,那我们看一下怎么做:
mingyan = response.css('div.quote')  # 提取首页所有名言,保存至变量mingyan

        for v in mingyan:  # 循环获取每一条名言里面的:名言内容、作者、标签

            text = v.css('.text::text').extract_first()  # 提取名言
            autor = v.css('.author::text').extract_first()  # 提取作者
            tags = v.css('.tags .tag::text').extract()  # 提取标签
            tags = ','.join(tags)  # 数组转换为字符串
            # 接下来,进行保存
            
好了,可以看到,关键是:
 for v in mingyan:
表示把 mingyan 这个数据集里面的数据,循环赋值给:v ,第一次循环的话 v 就代表第一条数据,那      text = v.css('.text::text').extract_first()        就代表第一条数据的名言内容,以此类推,把所有数据都取了出来,最终进行保存,我们看一下完整的代码:
import scrapy

class itemSpider(scrapy.Spider):

    name = 'listSpider'

    start_urls = ['http://lab.scrapyd.cn']

    def parse(self, response):
        mingyan = response.css('div.quote')  # 提取首页所有名言,保存至变量mingyan

        for v in mingyan:  # 循环获取每一条名言里面的:名言内容、作者、标签

            text = v.css('.text::text').extract_first()  # 提取名言
            autor = v.css('.author::text').extract_first()  # 提取作者
            tags = v.css('.tags .tag::text').extract()  # 提取标签
            tags = ','.join(tags)  # 数组转换为字符串

            """
            接下来进行写文件操作,每个名人的名言储存在一个txt文档里面
            """
            fileName = '%s-语录.txt' % autor  # 定义文件名,如:木心-语录.txt

            with open(fileName, "a+") as f:  # 不同人的名言保存在不同的txt文档,“a+”以追加的形式
                f.write(text)
                f.write('\n')  # ‘\n’ 表示换行
                f.write('标签:' + tags)
                f.write('\n-------\n')
                f.close()

好了,里面也有详细的注释,这就是爬取列表的方法,关键是循环的使用,诸君下了跑一跑就能明白其中的含义了!

listSpider源码地址:github

评论去哪里了?

由于搜狐畅言广告越来越丧心病狂,用它一个评论,半个网页都被它占领,感觉已经把灵魂出卖给了魔鬼!SO,为了息众怒小编只能暂且关闭评论,若您实在想找我说话,欢迎关注公众号,给我留言,么么哒!