2013-10-31 3 views
5

Ich möchte this website crawlen. Ich habe eine Spinne geschrieben, aber es kriecht nur die Titelseite, d. H. Die Top 52 Artikel.Wie scrappe website mit infinte scrolling?

Ich habe diesen Code versucht:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import Request 
a=[] 
from aqaq.items import aqaqItem 
import os 
import urlparse 
import ast 

    class aqaqspider(BaseSpider): 
     name = "jabong" 
     allowed_domains = ["jabong.com"] 
     start_urls = [ 
      "http://www.jabong.com/women/clothing/womens-tops/", 
     ] 

     def parse(self, response): 
      # ... Extract items in the page using extractors 
        n=3 
        ct=1 

        hxs = HtmlXPathSelector(response) 
        sites=hxs.select('//div[@id="page"]') 
        for site in sites: 
          name=site.select('//div[@id="content"]/div[@class="l-pageWrapper"]/div[@class="l-main"]/div[@class="box box-bgcolor"]/section[@class="box-bd pan mtm"]/ul[@id="productsCatalog"]/li/a/@href').extract() 
          print name 
          print ct 
          ct=ct+1 
          a.append(name) 
        req= Request (url="http://www.jabong.com/women/clothing/womens-tops/?page=" + str(n) , 
        headers = {"Referer": "http://www.jabong.com/women/clothing/womens-tops/", 
          "X-Requested-With": "XMLHttpRequest"},callback=self.parse,dont_filter=True) 

        return req # and your items 

Es zeigt folgende Ausgabe:

2013-10-31 09:22:42-0500 [jabong] DEBUG: Crawled (200) <GET http://www.jabong.com/women/clothing/womens-tops/?page=3> (referer: http://www.jabong.com/women/clothing/womens-tops/) 
2013-10-31 09:22:42-0500 [jabong] DEBUG: Filtered duplicate request: <GET http://www.jabong.com/women/clothing/womens-tops/?page=3> - no more duplicates will be shown (see DUPEFILTER_CLASS) 
2013-10-31 09:22:42-0500 [jabong] INFO: Closing spider (finished) 
2013-10-31 09:22:42-0500 [jabong] INFO: Dumping Scrapy stats: 

Als ich dont_filter=True legte es wird nie aufhören.

+0

tat u die Lösung bekam? –

+0

Nein, ich habe keine Lösung. – user2823667

Antwort

4

Ja, dont_filter muss hier verwendet werden, da nur page GET-Parameter in der XHR-Anforderung bei jedem Scrollen der Seite nach unten in http://www.jabong.com/women/clothing/womens-tops/?page=X geändert werden.

Jetzt müssen Sie herausfinden, wie Sie das Crawlen stoppen können. Das ist eigentlich einfach - überprüfen Sie einfach, wenn keine Produkte auf der nächsten Seite in der Warteschlange sind und erhöhen CloseSpider exception.

das komplette Codebeispiel ist das für mich arbeitet (hält an Seitennummer 234):

import scrapy 
from scrapy.exceptions import CloseSpider 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 


class Product(scrapy.Item): 
    brand = scrapy.Field() 
    title = scrapy.Field() 


class aqaqspider(BaseSpider): 
    name = "jabong" 
    allowed_domains = ["jabong.com"] 
    start_urls = [ 
     "http://www.jabong.com/women/clothing/womens-tops/?page=1", 
    ] 
    page = 1 

    def parse(self, response): 
     products = response.xpath("//li[@data-url]") 

     if not products: 
      raise CloseSpider("No more products!") 

     for product in products: 
      item = Product() 
      item['brand'] = product.xpath(".//span[contains(@class, 'qa-brandName')]/text()").extract()[0].strip() 
      item['title'] = product.xpath(".//span[contains(@class, 'qa-brandTitle')]/text()").extract()[0].strip() 
      yield item 

     self.page += 1 
     yield Request(url="http://www.jabong.com/women/clothing/womens-tops/?page=%d" % self.page, 
         headers={"Referer": "http://www.jabong.com/women/clothing/womens-tops/", "X-Requested-With": "XMLHttpRequest"}, 
         callback=self.parse, 
         dont_filter=True) 
0

Wenn Sie offene Entwickler-Konsole auf der Seite, würden Sie sehen, dass der Seiteninhalt in einem webrequest zurückgegeben:

http://www.jabong.com/home-living/furniture/new-products/?page=1

Dies gibt ein HTML-Dokument mit allen Elementen in ihm. Daher würde ich den Wert von page und parsing einfach erhöhen, bis der zurückgegebene HTML-Code dem zuvor zurückgegebenen HTML-Code entspricht.

+0

aber dieser Link leitet Sie direkt auf die Homepage daher nicht in der Lage, die Seite in diesem Link extrahieren Ich habe versucht, mit dieser URL auch Crawlen, aber es zeigt nur die Hauptseite Quelle so wie das zu tun, was Ideen ich bin falsch machen ?? – user2823667

-2
$curl_handle=curl_init();  
curl_setopt($curl_handle,CURLOPT_URL,'http://www.jabong.com/women/clothing/womens-tops/?page=3');  
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0');  
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest'));  
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); 
$htmldata = curl_exec($curl_handle);  
curl_close($curl_handle); 

Es funktioniert für mich. Bitte rufen Sie durch PHP Curl

+0

Es gehört nicht hierher. Das OP fragt nach Python + Scrap-spezifischer Lösung. – alecxe

+0

Das funktioniert nicht Typ –

0

Mit dont_filter und eine neue Anfrage jedes Mal wird in der Tat für immer laufen, es sei denn, es gibt eine Fehlerreaktion.

Gehen Sie in Ihrem Browser durch das unendliche Scrollen und sehen Sie, welche Antwort es gibt, wenn keine weiteren Seiten mehr vorhanden sind. Bearbeite dann in der Spinne diesen Fall, indem du keine neue Anfrage stellst.

1

Sie diesen Code versuchen können, eine leichte Variation von alecxe ‚s-Code,

Wenn keine Produkte gibt es dann einfach return von der Funktion und was schließlich zum Schließen der Spinne führt. Einfache Lösung.

import scrapy 
from scrapy.exceptions import CloseSpider 
from scrapy.spider import Spider 
from scrapy.http import Request 


class aqaqItem(scrapy.Item): 
    brand = scrapy.Field() 
    title = scrapy.Field() 


class aqaqspider(Spider): 
    name = "jabong" 
    allowed_domains = ["jabong.com"] 
    start_urls = ["http://www.jabong.com/women/clothing/womens-tops/?page=1"] 
    page_index = 1 

    def parse(self, response): 
     products = response.xpath("//li[@data-url]") 
     if products: 
      for product in products: 
       brand = product.xpath(
        ".//span[contains(@class, 'qa-brandName')]/text()").extract() 
       brand = brand[0].strip() if brand else 'N/A' 
       title = product.xpath(
        ".//span[contains(@class, 'qa-brandTitle')]/text()").extract() 
       title = title[0].strip() if title else 'N/A' 
       item = aqaqItem() 
       item['brand']=brand, 
       item['title']=title 
       yield item 
     # here if no products are available , simply return, means exiting from 
     # parse and ultimately stops the spider 
     else: 
      return 

     self.page_index += 1 
     if page_index: 
      yield Request(url="http://www.jabong.com/women/clothing/womens-tops/?page=%s" % (self.page_index + 1), 
          callback=self.parse) 

obwohl die Spinne Erträge mehr als 12,5k Produkte es viele doppelte Einträge enthält, ich habe einen ITEM_PIPELINE gemacht, die die doppelten Einträge entfernen wird und in das mongodb.

Pipeline Code unten,

from pymongo import MongoClient 


class JabongPipeline(object): 

    def __init__(self): 
     self.db = MongoClient().jabong.product 

    def isunique(self, data): 
     return self.db.find(data).count() == 0 

    def process_item(self, item, spider): 
     if self.isunique(dict(item)): 
      self.db.insert(dict(item)) 
     return item 

und Anbringen des scrapy Logstatus hier

2015-04-19 10:00:58+0530 [jabong] INFO: Dumping Scrapy stats: 
     {'downloader/request_bytes': 426231, 
     'downloader/request_count': 474, 
     'downloader/request_method_count/GET': 474, 
     'downloader/response_bytes': 3954822, 
     'downloader/response_count': 474, 
     'downloader/response_status_count/200': 235, 
     'downloader/response_status_count/301': 237, 
     'downloader/response_status_count/302': 2, 
     'finish_reason': 'finished', 
     'finish_time': datetime.datetime(2015, 4, 19, 4, 30, 58, 710487), 
     'item_scraped_count': 12100, 
     'log_count/DEBUG': 12576, 
     'log_count/INFO': 11, 
     'request_depth_max': 234, 
     'response_received_count': 235, 
     'scheduler/dequeued': 474, 
     'scheduler/dequeued/memory': 474, 
     'scheduler/enqueued': 474, 
     'scheduler/enqueued/memory': 474, 
     'start_time': datetime.datetime(2015, 4, 19, 4, 26, 17, 867079)} 
2015-04-19 10:00:58+0530 [jabong] INFO: Spider closed (finished) 
+0

, wenn ich diese URL http://www.jabong.com/women/clothing/kurtas-suit-sets/kurtas-kurtis/?page=1 es http://www.jabong.com/Frauen/Kleidung/kurtas-suit-sets/kurtsas-kurtis/so unsere Lösung funktioniert nicht, es gibt nur 52 Ergebnis und da die Daten durch Ajax geladen werden, erhalte ich kein Ergebnis mehr als 52 –

+0

@Sameer Shaikh Hast du gelaufen der obige Code durch Ändern der Start-URL mit Ihrem ?? – Jithin

+0

ok es funktionierte nur ich musste die Header in der Anfrage senden und es hat funktioniert –