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
QQ20160726-0.png
第一次提取出來的是一整塊的內容:(即多條數據塊內容)
infos = selector.xpath('//li/div')
第二次在這個節點下提取整塊中的數據字段:
author = info.xpath('p/a/text()').extract()
title = info.xpath('h4/a/text()').extract()
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.lxweimin.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