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.