Extrae datos de una página de gsmarena usando scrapy

Estoy intentando descargar datos de una página de gsmarena: ” http://www.gsmarena.com/htc_one_me-7275.php “.

Sin embargo, los datos se clasifican en forma de tablas y filas de tablas. Los datos son del formato:

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

Código editado: Gracias a la ayuda de los miembros de la comunidad en stackexchange, he reformateado el código como: archivo Items.py:

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

Archivo de araña:

 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 

Sin embargo, me están prohibiendo tan pronto como bash incluso cargar la página en shell shell utilizando:

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

Incluso he intentado usar DOWNLOAD_DELAY = 3 en settings.py.

Por favor sugiera cómo debo hacerlo.

La idea sería iterar sobre todos table elementos de la table dentro de la “lista de especificaciones”, obtener el elemento th para el nombre del bloque, obtener todos los elementos td con class="ttl" y los siguientes hermanos td correspondientes con class="nfo" .

Demo desde el shell:

 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 

También me enfrenté con el mismo problema de ser expulsado en pocas solicitudes, cambiar los proxies mediante el uso de ” scrapy-proxies” y el uso de autotrottling me ayudó significativamente, pero no resolví el problema por completo.

Puedes encontrar mi código en gsmarenacrawler