2015-06-05 2 views
2

Я пытаюсь загрузить данные с страницы gsmarena: «http://www.gsmarena.com/htc_one_me-7275.php».Извлечь данные из страницы gsmarena с помощью scrapy

Однако данные классифицируются в виде таблиц и строк таблицы. Данные формата:

table header > td[@class='ttl'] > td[@class='nfo'] 

Edited код: Благодаря помощи членов сообщества в stackexchange, я переформатировать код, как: Items.py файла:

import scrapy 

class gsmArenaDataItem(scrapy.Item): 
    phoneName = scrapy.Field() 
    phoneDetails = scrapy.Field() 
    pass 

паук файл:

from scrapy.selector import Selector 
from scrapy import Spider 
from gsmarena_data.items import gsmArenaDataItem 

class testSpider(Spider): 
    name = "mobile_test" 
    allowed_domains = ["gsmarena.com"] 
    start_urls = ('http://www.gsmarena.com/htc_one_me-7275.php',) 

    def parse(self, response): 
     # extract whatever stuffs you want and yield items here 
     hxs = Selector(response) 
     phone = gsmArenaDataItem() 
     tableRows = hxs.css("div#specs-list table") 
     for tableRows in tableRows: 
      phone['phoneName'] = tableRows.xpath(".//th/text()").extract()[0] 
      for ttl in tableRows.xpath(".//td[@class='ttl']"): 
       ttl_value = " ".join(ttl.xpath(".//text()").extract()) 
       nfo_value = " ".join(ttl.xpath("following-sibling::td[@class='nfo']//text()").extract()) 
       colonSign = ": " 
       commaSign = ", " 
       seq = [ttl_value, colonSign, nfo_value, commaSign] 
       phone['phoneDetails'] = "".join(seq) 
     yield phone 

Однако я получаю запрет, как только я пытаюсь даже загрузить страницу в Scrapy оболочки с помощью:

"http://www.gsmarena.com/htc_one_me-7275.php" 

Я даже попытался использовать DOWNLOAD_DELAY = 3 в settings.py.

Просьба предложить, как мне это сделать.

ответ

1

Идея заключается в том, чтобы перебрать все table элементы внутри «СПЕЦ-списка», получите th элемент для имени блока, получить все td элементы с class="ttl" и соответствующие следующие td братьев и сестер с class="nfo".

Demo из оболочки:

In [1]: for scope in response.css("div#specs-list table"): 
      scope_name = scope.xpath(".//th/text()").extract()[0] 

      for ttl in scope.xpath(".//td[@class='ttl']"): 
       ttl_value = " ".join(ttl.xpath(".//text()").extract()) 
       nfo_value = " ".join(ttl.xpath("following-sibling::td[@class='nfo']//text()").extract()) 

       print scope_name, ttl_value, nfo_value 
    ....:  
Network Technology GSM/HSPA/LTE 
Network 2G bands GSM 850/900/1800/1900 - SIM 1 & SIM 2 
... 
Battery Stand-by Up to 598 h (2G)/Up to 626 h (3G) 
Battery Talk time Up to 23 h (2G)/Up to 13 h (3G) 
Misc Colors Meteor Grey, Rose Gold, Gold Sepia 
+0

Я обновил код, как это предлагается, но GSMArena продолжает запрещая меня. – ajhavery

+0

@ajhavery, поскольку первоначальный вопрос был другим, и это продолжение, задайте отдельный вопрос. – alecxe

0

Я также столкнулся с той же проблемой получения запрещены в течение нескольких запросов, изменение прокси с помощью scrapy-proxies и с использованием autothrottling значительно помогло, но не решает проблему полностью.

Вы можете найти свой код на gsmarenacrawler

Смежные вопросы