Scrapy在一个页面抓取一条数据较为简单。如果在一个页面上抓取多条数据,循环点取在哪里,有一个技巧。
以简书首页为例。如抓取热门文章,一条信息包含:作者、文章标题、阅读量、评论数量、喜欢数、打赏数。在一个页面上有多条数据。
这里实际上,就是把页面上的数据提取出来封装成一个对象item,只是最后没有放在集合中。
items定义
class JsuserItem(Item):
author = Field()
url = Field()
title = Field()
reads = Field()
comments = Field()
likes = Field()
rewards = Field()
提取数据循环点应为包含多条数据的一条信息的标签开始,分析页面代码就是 div>li
第一次提取出来的是一整块的内容:(即多条数据块内容)
infos = selector.xpath('//li/div')
第二次在这个节点下提取整块中的数据字段:
author = info.xpath('p/a/text()').extract()
title = info.xpath('h4/a/text()').extract()
完整代码:
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