2015-07-03 175 views
1

我剛開始抓取。我試圖通過使用Scrapy框架和Python 2.7下載內容來從網站http://www.indiabix.com/verbal-ability/spotting-errors/抓取問題和答案。我注意到,如果你查看其源代碼,你會發現,答案的每一個問題應該是在B標籤,但它不是:使用Scrapy抓取隱藏數據

<div class="div-spacer"> 
    <p><span class="ib-green"><b>Answer:</b></span> Option <b class="jq-hdnakqb"></b></p> 
    <p><span class="ib-green"><b>Explanation:</b></span></p> 
    <p> No answer description available for this question. <b><a href="discussion-399">Let us discuss</a></b>. </p> 

如果我們在網頁上檢查元素,我們可以看到正確答案爲文本標籤之間:答案:每個問題的選項A或B等,但HTML源代碼不包含。

爲了得到b標籤內的文本,我嘗試了使用xpath的15個查詢。 我編寫了下面代碼中最可能的4-5個查詢作爲註釋。

import scrapy 
import urllib 
import json 
from errors1.items import Errors1Item 

class Errors1Spider(scrapy.Spider) : 
    name = "errors1" 
    start_urls = ["http://www.indiabix.com/verbal-ability/spotting-errors/"] 

    def parse(self, response) : 
     i = 0 
     y = 0 
     j = json.loads(json.dumps(response.xpath('//td[contains(@id, "tdOption")]/text()').extract())) 
     x = json.loads(json.dumps(response.xpath('//div[@class="div-spacer"]/p[3]/text()').extract())) 

     #to get correct answer 
     #response.xpath('//div[@class = "div-spacer"]/p/b/text()').extract() 
     #response.xpath('//div[@class = "div-spacer"]/p[1]/b/text()').extract() 
     #response.xpath('//div[@class = "div-spacer"]/p//text()').extract() 
     #response.xpath('//b[@class = "jq-hdnakqb"]/text()').extract() 
     #response.xpath('string(//div[@class = "div-spacer"]/p/b/text())').extract() 

     while i<len(j) and y<len(x) : 
      item = Errors1Item() 
      item['optionA'] = j[i] 
      i+=1 
      item['optionB'] = j[i] 
      i+=1 
      item['optionC'] = j[i] 
      i+=1 
      item['optionD'] = j[i] 
      i+=1 
      item['explanation'] = x[y] 
      y+=1 
      yield item 

有人可以幫助我從該網頁獲取答案內容。 謝謝

回答

0

從我的理解,有一個JavaScript邏輯涉及設置正確的選項值。

什麼幫助我解決它是scrapyjs middleware,它使用瀏覽器作爲服務Splash。跳過安裝和配置,下面是我執行的蜘蛛:

# -*- coding: utf-8 -*- 
import scrapy 


class IndiaBixSpider(scrapy.Spider): 
    name = "indiabix" 
    allowed_domain = ["www.indiabix.com"] 
    start_urls = ["http://www.indiabix.com/verbal-ability/spotting-errors/"] 

    def start_requests(self): 
     for url in self.start_urls: 
      yield scrapy.Request(url, meta={ 
       'splash': { 
        'endpoint': 'render.html', 
        'args': {'wait': 0.5} 
       } 
      }) 

    def parse(self, response): 
     for question in response.css("div.bix-div-container"): 
      answer = question.xpath(".//input[starts-with(@id, 'hdnAnswer')]/@value").extract() 
      print answer 

,這裏是什麼,我已經得到了控制檯上(正確答案):

[u'A'] 
[u'C'] 
[u'A'] 
[u'C'] 
[u'C'] 
[u'C'] 
[u'B'] 
[u'A'] 
[u'D'] 
[u'C'] 
[u'B'] 
[u'B'] 
[u'A'] 
[u'B'] 
[u'B'] 

參見:

+0

我試圖運行此完全相同的代碼,但我仍然不明白任何輸出和即時獲取一個空集。我想我可能配置錯了。你能把你的settings.py文件發給我嗎? – pratibha

+0

@pratibha它們與鏈接答案中的完全相同。另外,確保飛濺正在運行。 – alecxe