2013-05-15 7 views
6

Próbuję złomowaniu website z scrapy ale mam problem z złomowanie wszystkie produkty z tej strony, ponieważ jest za pomocą niekończące przewijanie ...strona Scrap użyciu scrapy

mogę złom tylko poniżej danych za 52 tylko przedmioty, ale ich jest 3824 pozycji.

hxs.select("//span[@class='itm-Catbrand strong']").extract() 
hxs.select("//span[@class='itm-price ']").extract() 
hxs.select("//span[@class='itm-title']").extract() 

jeśli mogę użyć hxs.select("//div[@id='content']/div/div/div").extract() Następnie wyodrębnia listę całych przedmiotów, ale to przyzwyczajenie filtrować dalej .... Jak mogę złom wszystkie elementy ...

Próbowałem tego, ale sam wynik. Proszę mi powiedzieć, gdzie się mylę ...

def parse(self, response): 
    filename = response.url.split("/")[-2] 
    open(filename, 'wb').write(response.body 
    for n in [2,3,4,5,6]:    
    req = Request(url="http://www.jabong.com/men/shoes/?page=" + n, 
         headers = {"Referer": "http://www.jabong.com/men/shoes/", 
           "X-Requested-With": response.header['X-Requested-With']}) 
    return req 
+0

Nie jestem pewien, czy 'response.header ['X-Requested-With']' jest równy "XMLHttpRequest", więc witryna może przekierować cię na stronę oryginalnych przedmiotów. Plus prawdopodobnie powinieneś użyć 'yield req' lub umieścić wszystkie żądania na liście. – Xion345

+1

Jak ustawić nagłówek, o którym wspomniałeś wcześniej ... i używając zwrotu/zysku otrzymuję ten błąd 'BŁĄD: Pająk musi zwrócić Żądanie, BaseItem lub Brak, dostał Żądanie w ' –

Odpowiedz

5

Jak można się domyślić, ta strona używa javascript, aby załadować więcej elementów podczas przewijania strony .

Korzystanie deweloperom narzędzi zawartych w mojej przeglądarce (Ctrl-Maj i chromu), widziałem w zakładce Network, że skrypt javascript zawarte na stronie wykonuje następujące wnioski załadować więcej rzeczy:

GET http://www.website-your-are-crawling.com/men/shoes/?page=2 # 2,3,4,5,6 etc... 

serwer wWW odpowiada dokumentach typu:

<li id="PH969SH70HPTINDFAS" class="itm hasOverlay unit size1of4 "> 
    <div id="qa-quick-view-btn" class="quickviewZoom itm-quickview ui-buttonQuickview l-absolute pos-t" title="Quick View" data-url ="phosphorus-Black-Moccasins-233629.html" data-sku="PH969SH70HPTINDFAS" onClick="_gaq.push(['_trackEvent', 'BadgeQV','Shown','OFFER INSIDE']);">Quick view</div> 

            <div class="itm-qlInsert tooltip-qlist highlightStar" 
        onclick="javascript:Rocket.QuickList.insert('PH969SH70HPTINDFAS', 'catalog'); 
              return false;" > 
               <div class="starHrMsg"> 
         <span class="starHrMsgArrow">&nbsp;</span> 
         Save for later       </div> 
             </div> 
       <a id='cat_105_PH969SH70HPTINDFAS' class="itm-link sobrTxt" href="/phosphorus-Black-Moccasins-233629.html" 
            onclick="fireGaq('_trackEvent', 'Catalog to PDP', 'men--Shoes--Moccasins', 'PH969SH70HPTINDFAS--1699.00--', this),fireGaq('_trackEvent', 'BadgePDP','Shown','OFFER INSIDE', this);"> 
        <span class="lazyImage"> 
         <span style="width:176px;height:255px;" class="itm-imageWrapper itm-imageWrapper-PH969SH70HPTINDFAS" id="http://static4.jassets.com/p/Phosphorus-Black-Moccasins-6668-926332-1-catalog.jpg" itm-img-width="176" itm-img-height="255" itm-img-sprites="4"> 
          <noscript><img src="http://static4.jassets.com/p/Phosphorus-Black-Moccasins-6668-926332-1-catalog.jpg" width="176" height="255" class="itm-img"></noscript> 
         </span>        
        </span> 

              <span class="itm-budgeFlag offInside"><span class="flagBrdLeft"></span>OFFER INSIDE</span>      
              <span class="itm-Catbrand strong">Phosphorus</span> 
        <span class="itm-title"> 
                       Black Moccasins      </span> 

te dokumenty zawierają więcej elementów.

Tak więc, aby uzyskać pełną listę elementów będzie trzeba wrócić Request obiektów w metodzie swój pajęczy parse (Patrz Spider class documentation), aby powiedzieć scrapy że powinien załadować więcej danych:

def parse(self, response): 
    # ... Extract items in the page using extractors 
    n = number of the next "page" to parse 
    # You get get n by using response.url, extracting the number 
    # at the end and adding 1 

    # It is VERY IMPORTANT to set the Referer and X-Requested-With headers 
    # here because that's how the website detects if the request was made by javascript 
    # or direcly by following a link. 
    req = Request(url="http://www.website-your-are-crawling.com/men/shoes/?page=" + n, 
     headers = {"Referer": "http://www.website-your-are-crawling.com/men/shoes/", 
      "X-Requested-With": "XMLHttpRequest"}) 
    return req # and your items 

Aha, a przy okazji (na wypadek, gdybyś chciał przetestować), nie możesz po prostu załadować http://www.website-your-are-crawling.com/men/shoes/?page=2 w przeglądarce, aby zobaczyć, co powraca, ponieważ witryna przekieruje Cię do strony globalnej (np. http://www.website-your-are-crawling.com/men/shoes/), jeśli nagłówek X-Requested-With jest inny od XMLHttpRequest.

+0

Muszę więc ustawić nagłówek żądania przy ponownym wysyłaniu żądania ... –

+0

@ user2217267 Czy jesteś w stanie rozwiązać swój problem? – user2129794