Scrapy 抓取数据提取对象小技巧

Scrapy在一个页面抓取一条数据较为简单。如果在一个页面上抓取多条数据,循环点取在哪里,有一个技巧。

以简书首页为例。如抓取热门文章,一条信息包含:作者、文章标题、阅读量、评论数量、喜欢数、打赏数。在一个页面上有多条数据。

《Scrapy 抓取数据提取对象小技巧》 QQ20160726-2.png

这里实际上,就是把页面上的数据提取出来封装成一个对象item,只是最后没有放在集合中。

items定义

class JsuserItem(Item):

    author = Field()
    url = Field()
    title = Field()
    reads = Field()
    comments = Field()
    likes = Field()
    rewards = Field()

提取数据循环点应为包含多条数据的一条信息的标签开始,分析页面代码就是 div>li

《Scrapy 抓取数据提取对象小技巧》 QQ20160726-0.png

第一次提取出来的是一整块的内容:(即多条数据块内容)

  infos = selector.xpath('//li/div')

第二次在这个节点下提取整块中的数据字段:

            author = info.xpath('p/a/text()').extract()
            title = info.xpath('h4/a/text()').extract()

《Scrapy 抓取数据提取对象小技巧》 QQ20160726-1.png

完整代码:

    def parse(self, response):

        selector = Selector(response)

        infos = selector.xpath('//li/div')

        for info in infos:

            item = JsuserItem()

            author = info.xpath('p/a/text()').extract()
            title = info.xpath('h4/a/text()').extract()
            url = info.xpath('h4/a/@href').extract()
            reads = info.xpath('div/a[1]/text()').extract()
            comments = info.xpath('div/a[2]/text()').extract()

            likes = info.xpath('div/span[1]/text()').extract()

            #注意有些文章是没有打赏的
            rewards = info.xpath('div/span[2]/text()')
            if len(rewards)==1 :
                rds = info.xpath('div/span[2]/text()').extract()
                rds = int(filter(str.isdigit,str(rds[0])))
            else:
                rds = 0

            item['author']=author
            item['title']=title

            item['url']='http://www.jianshu.com'+url[0]
            item['reads']=int(filter(str.isdigit,str(reads[0])))
            item['comments']=int(filter(str.isdigit,str(comments[0])))
            item['likes']=int(filter(str.isdigit,str(likes[0])))
            item['rewards']=rds
点赞