scrapy提取一组数据

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

上面我们已经学了几个scrapy给我们提供的,提取网页数据的函数,上面的话我们只是在命令行使用,那经过我们的scrapy shell验证正确之后,我们怎么把它写进我们的蜘蛛文件?怎么让它提取数据?那接下来我们来看一下具体的操作。

我们继续蹂躏这个网站:http://lab.scrapyd.cn sad 我们先试着提取里面一条名言的信息,然后进一步提取多条;
那一条名言其实包含这么几个部分:名言、作者、标签,如下图:

scrapy中文文档

我们打开源代码,再来看一下对应的HTML标签:
<div class="quote post">
	<span class="text">
		各种时代,各国诗人,个抓个的痒。scrapy中文网(http://www.scrapyd.cn)整理
	</span>
	<span>
		作者:<small class="author">木心</small>
		<a href="http://lab.scrapyd.cn/archives/29.html">【详情】</a>
	</span>
	<p></p>
	<div class="tags">
		标签 :
		<a href="http://lab.scrapyd.cn/tag/木心/">木心</a> , 
		<a href="http://lab.scrapyd.cn/tag/艺术/">艺术</a>  
	</div>
</div>
那我们要爬取的标签就是:

名言,对应着 class=“text” 标签里面的内容;
作者,对应着 class=“authou” 里面的内容;
标签,对应着 class=“tags” 里面的内容;

因为我们提取的是第一段名言里面的数据,所以我们需要先找到第一段名言,然后保存在一个变量里面,再进一步提取里面的以上数据,那我们要怎么找到第一段名言呢,我们先来看一下HTML结构:
<div class="quote post">
	……
</div>

<div class="quote post">
	……
</div>

<div class="quote post">
	……
</div>
……
我们可以看到,每一段名言都被一个 <div class="quote post">……</div> 包裹,那如果我们要找到第一段名言我们可以这样写:
 mingyan1 = response.css('div.quote')[0]
这样的话,我们就把第一段名言保存在:mingyan1  这么一个变量里面了。为什么会有一个:[0] 这表示提取第一段,如果没有这个限制,那我们提取的是本页所有名言。接下来我们就可以来提取里面的:名言内容、作者、标签了。首先提取名言内容,可以这样写:
>>> mingyan1.css('.text::text').extract_first()
 '各种时代,各国诗人,个抓个的痒。scrapy中文网(http://www.scrapyd.cn)
整理'
好了,这样我们已经得到了第一段里面的名言内容,上面的表达式里面,我们使用了:.text   这是class选择器,如果是id选择器的话:#text 这些都是HTML的只是,不多说。那接下来我们提取作者:
 >>> mingyan1.css('.author::text').extract_first()
 '木心'
用的还是class选择器!接下来我们提取标签:
 >>> mingyan1.css('.tags .tag::text').extract()
 ['木心', '艺术']
这里的话,大家可以发现我们用的并非是.extract_first()  而是 extract(),why?应为里面有多个标签,我们并非只是提取一个,而是要把所有标签都提取出来,因此就用了:.extract() 

好了,所有内容都已经在scrapy shell 里面验证通过了,那接下来我们把它合并到我们蜘蛛里面,代码如下:
import scrapy


class itemSpider(scrapy.Spider):
    name = 'itemSpider'
    start_urls = ['http://lab.scrapyd.cn']

    def parse(self, response):
        mingyan = response.css('div.quote')[0]

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

        fileName = '%s-语录.txt' % autor  # 爬取的内容存入文件,文件名为:作者-语录.txt
        f = open(fileName, "a+")  # 追加写入文件
        f.write(text)  # 写入名言内容
        f.write('\n')  # 换行
        f.write('标签:'+tags)  # 写入标签
        f.close()  # 关闭文件操作
不多解释了,注释已经很详细了。

itemSpider源码地址:github

评论去哪里了?

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