raspadura rastreo araña ajax paginación

Estaba intentando desechar el enlace que tiene una llamada ajax para la paginación. Estoy tratando de rastrear el enlace http://www.demo.com . y en el archivo .py proporcioné este código para restringir XPATH y la encoding es:

# -*- coding: utf-8 -*- import scrapy from scrapy.contrib.linkextractors import LinkExtractor from scrapy.contrib.spiders import sumSpider, Rule from scrapy.selector import HtmlXPathSelector from sum.items import sumItem class Sumspider1(sumSpider): name = 'sumDetailsUrls' allowed_domains = ['sum.com'] start_urls = ['http://www.demo.com'] rules = ( Rule(LinkExtractor(restrict_xpaths='.//ul[@id="pager"]/li[8]/a'), callback='parse_start_url', follow=True), ) #use parse_start_url if your spider wants to crawl from first page , so overriding def parse_start_url(self, response): print '********************************************1**********************************************' #//div[@class="showMoreCars hide"]/a #.//ul[@id="pager"]/li[8]/a/@href self.log('Inside - parse_item %s' % response.url) hxs = HtmlXPathSelector(response) item = sumItem() item['page'] = response.url title = hxs.xpath('.//h1[@class="page-heading"]/text()').extract() print '********************************************title**********************************************',title urls = hxs.xpath('.//a[@id="linkToDetails"]/@href').extract() print '**********************************************2***url*****************************************',urls finalurls = [] for url in urls: print '---------url-------',url finalurls.append(url) item['urls'] = finalurls return item 

Mi archivo items.py contiene

 from scrapy.item import Item, Field class sumItem(Item): # define the fields for your item here like: # name = scrapy.Field() page = Field() urls = Field() 

Aún no estoy obteniendo un resultado exacto que no pueda recuperar todas las páginas cuando lo estoy rastreando.

Espero que el siguiente código ayude.

somespider.py

 # -*- coding: utf-8 -*- import scrapy import re from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import Selector from scrapy.spider import BaseSpider from demo.items import DemoItem from selenium import webdriver def removeUnicodes(strData): if(strData): strData = strData.encode('utf-8').strip() strData = re.sub(r'[\n\r\t]',r' ',strData.strip()) return strData class demoSpider(scrapy.Spider): name = "domainurls" allowed_domains = ["domain.com"] start_urls = ['http://www.domain.com/used/cars-in-trichy/'] def __init__(self): self.driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNITWITHJS) def parse(self, response): self.driver.get(response.url) self.driver.implicitly_wait(5) hxs = Selector(response) item = DemoItem() finalurls = [] while True: next = self.driver.find_element_by_xpath('//div[@class="showMoreCars hide"]/a') try: next.click() # get the data and write it to scrapy items item['pageurl'] = response.url item['title'] = removeUnicodes(hxs.xpath('.//h1[@class="page-heading"]/text()').extract()[0]) urls = self.driver.find_elements_by_xpath('.//a[@id="linkToDetails"]') for url in urls: url = url.get_attribute("href") finalurls.append(removeUnicodes(url)) item['urls'] = finalurls except: break self.driver.close() return item 

items.py

 from scrapy.item import Item, Field class DemoItem(Item): page = Field() urls = Field() pageurl = Field() title = Field() 

Nota: debe tener el servidor de Selenium rc en ejecución porque HTMLUNITWITHJS funciona con selenium rc solo usando Python.

Ejecute su servidor de selenium rc emitiendo el comando :

 java -jar selenium-server-standalone-2.44.0.jar 

Ejecuta tu araña usando el comando :

 spider crawl domainurls -o someoutput.json 

Puede consultar con su navegador cómo se realizan las solicitudes.

Detrás de la escena, justo después de hacer clic en el botón “mostrar más autos”, su navegador solicitará datos JSON para alimentar su próxima página. Puede aprovechar este hecho y tratar directamente con los datos de JSON sin la necesidad de trabajar con un motor de JavaScript como Selenium o PhantomJS.

En su caso, como primer paso, debe simular que un usuario se desplaza hacia abajo en la página proporcionada por su parámetro start_url y su perfil al mismo tiempo que su red solicita descubrir el punto final que usa el navegador para solicitar ese JSON. En general, para descubrir este punto final, hay una sección XHR (XMLHttpRequest) en la herramienta de perfil del navegador como aquí en Safari, donde puede navegar por todos los recursos / puntos finales utilizados para solicitar los datos.

Una vez que descubre este punto final, es una tarea sencilla: le da a su Spider como start_url el punto final que acaba de descubrir y, de acuerdo con su proceso y navega a través de los JSON, puede descubrir si es una página próxima para solicitar.

PD: Vi para usted que la URL del punto final es http://www.carwale.com/webapi/classified/stockfilters/?city=194&kms=0-&year=0-&budget=0-&pn=2

En este caso, mi navegador solicitó la segunda página, como se puede ver en el parámetro pn. Es importante que establezca algunos parámetros de encabezado antes de enviar la solicitud. Noté en tu caso que los encabezados son:

Aceptar texto / plano, / ; q = 0.01

Referer http://www.carwale.com/used/cars-in-trichy/

X-Requested-with XMLHttpRequest

sourceid 1

Usuario-Agente Mozilla / 5.0 …