tutorial spider example español python web-scraping web-crawler scrapy

python - spider - cheque araña scrapy



scrapy spider (1)

El problema está dentro de la parse_items llamada parse_items . Cuando itera sobre las ofertas, los localizadores específicos del contexto de oferta deben ser relativos. En otras palabras, inicie sus expresiones XPath dentro del ciclo con un punto:

def parse_items(self, response): for deal in response.xpath("//div[@class=''user-comment-text''][1]"): item = DesidimeItem() item["deal"] = deal.xpath(".//p/text()").extract() item["link"] = deal.xpath(".//p[1]/a[1]/@href").extract() yield item

(Tenga en cuenta que también he simplificado el código).

Aquí está la araña completa, la estoy ejecutando (raspa el texto y los enlaces, aunque no sé cuál es tu resultado deseado):

import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class DesidimeItem(scrapy.Item): deal = scrapy.Field() link = scrapy.Field() class DesidimeSpider(CrawlSpider): name = "desidime" allowed_domains = ["desidime.com"] start_urls = ["http://www.desidime.com/forums/hot-deals-online"] rules = [ Rule(LinkExtractor(restrict_xpaths="//td[not(@*)]/div[not(@*)]/a[not(@class)]"), callback="parse_items", follow=True), ] def parse_items(self, response): for deal in response.xpath("//div[@class=''user-comment-text''][1]"): item = DesidimeItem() item["deal"] = deal.xpath(".//p/text()").extract() item["link"] = deal.xpath(".//p[1]/a[1]/@href").extract() yield item

así que estoy intentando raspar el sitio web en los parámetros de SgmlLinkExtractor debajo del sitio web con scrapy, y así es como se ve mi araña:

from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from desidime_sample.items import DesidimeItem import string class DesidimeSpider(CrawlSpider): name = "desidime" allowed_domains = ["desidime.com"] start_urls = ["http://www.desidime.com/forums/hot-deals-online"] rules = ( Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=(''''''//td[not(@*)]/div [not(@*)]/a[not(@class)]/@href'''''')), callback="parse_items", follow=True), ) def parse_items(self, response): hxs = HtmlXPathSelector(response) deals = hxs.select(''''''//div[@class=''user-comment-text''][1]'''''') items = [] for deals in deals: item = DesidimeItem() item["deal"] = deals.select("//div[@class=''user-comment-text''][1]/p/text()").extract() item["link"] = deals.select("//div[@class=''user-comment-text''][1]/p[1]/a[1]/@href").extract() items.append(item) return items

Debería ser bastante obvio lo que trato de hacer, pero por alguna razón cuando le digo a la araña que rastree y exporte el texto y los enlaces al archivo CVS, termino con:

enlace, tratar http://wwww.facebook.com/desidime , http://wwww.facebook.com/desidime , (lo mismo para muchas líneas más, luego :) ",,", "misma URL", (mismo cosa para muchas más líneas, entonces :) "enlace, ofertas"

Entonces, ¿alguien puede decirme cuál es el problema? Si ejecuta cada uno de mis xpaths anteriores como reponse.xpath("xpath").extract() scrapy shell "//corresponingcrawlruleurl" reponse.xpath("xpath").extract() después de scrapy shell "//corresponingcrawlruleurl" , obtendrá los resultados correctos.