2016-07-15 6 views
1

Ich versuche, eine Website mit scrapy zu kratzen, wird Meine Spinne wie folgt:Arbeiten mit Last mehr Anfrage mit scrapy Python

class AngelSpider(Spider): 


    name = "angel" 
    allowed_domains = ["angel.co"] 

    start_urls = (

     "https://angel.co/companies?locations[]=India", 


    ) 
    def start_requests(self): 
     page_size = 25 
     headers ={ 

     'Host': 'angel.co', 
     'Origin': 'https://angel.co', 
     'User-Agent': 'Scrapy spider', 
     'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 
     'Accept': '*/*', 
     'X-Requested-With': 'XMLHttpRequest', 
     'Referer': 'https://angel.co/companies?locations[]=India', 

     'Accept-Language': 'en-US', 
     } 



     for offset in (0, 200, page_size): 
      yield Request('https://angel.co/company_filters/search_data', 
          method='POST', 
          headers=headers, 
          body=urllib.urlencode(
           {'action': 'more', 
           'filter_data[locations][]':'India', 
           'sort':'signal', 
           'page':2})) 




    def parse(self, response): 
     nestd =[] 
     company = {} 
     val = response.xpath('//div[@data-_tn = "companies/trending/row" ]') 
     company_name = response.xpath("//div[@data-_tn = 'companies/trending/row' ]//div//div//div//div[@class='name']//text()").extract() 
     #company_link = val.xpath("//div//div//div[@class ='photo']//@href").extract() 
     #company_tag_line =val.xpath("//div//div//div//div//div[@class='pitch u-colorGray6']//text()").extract() 
     #company_from = val.xpath("//div//div//div//div//a[@name]//text()").extract() 
     print company_name 

Aber es ergibt keine Daten. Gibt es eine andere Möglichkeit, die Schaltfläche "Weitere Artikel laden" zu simulieren, um die Artikel zu laden und den Schaber fortzusetzen?

Antwort

-1

Die Website, die Sie versuchen zu verschrotten, verwendet Javascript, Sie müssen entweder Selenium oder Scrapy-splash verwenden, um den Browser zu emulieren.

+1

Sie müssen tatsächlich keine JS-Engine in Fällen wie diesem verwenden, wo alle Informationen, die Sie benötigen, nach ein paar XmlHttpRequests zurückgegeben werden. Schaut euch diesen Post an: https://blog.scrapinghub.com/2016/06/22/scrapy-tips-from-the-pros-june-2016/ –

+0

Ich hatte Selen verwendet, bin aber immer noch nicht in der Lage, die Daten abzuschaben Link zu meiner Spinne ist https://codeshare.io/vLqat werfen Sie einen Blick darauf –

0

Von dem, was ich gesehen habe, die Website zuerst hat eine POST-Anforderung an https://angel.co/company_filters/search_data, die JSON-Daten gibt die Start-IDs enthalten, wie folgt aus:

{ 
    "ids": [ 
     146538,277273,562440,67592,124939,...,460951 
    ], 
    "total": 18443, 
    "page": 2, 
    "sort": "signal", 
    "new": false, 
    "hexdigest": "a8ef7331cba6a01e5d2fc8f5cc3e04b69871f62f" 
} 

Danach, hat die Website eine GET-Anforderung an https://angel.co/companies/startups, übergeben Sie die Werte aus dem obigen JSON als URL-Parameter.

Die in Ihrem start_requests generierten Anforderungen sollten daher von einem anderen Rückruf behandelt werden, der die als Antwort zurückgegebenen JSON-Daten lesen und die URL erstellen sollte, um die tatsächliche Startliste im HTML-Format zu erhalten.

+0

Und wie diese Parameter genau aussehen sollten basierend auf "IDs"? Kannst du ein Beispiel geben? – mel

+0

r = requests.get ("https://angel.co/companies/startups/:id", Kopfzeilen = {'content-type': 'application/json'}, params = urllib.urlencode ({"startup_id") : 3725508})) funktioniert nicht – mel