2015-05-20 3 views
13

Ich versuche, die neuesten Bewertungen von Google Play Store zu kriechen, aber ich muss eine Postanforderung machen, um die neuesten Bewertungen zu erhalten.Absenden von Post-Anfrage in Scrapy

Mit dem Postman funktioniert es und ich bekomme die gewünschte Antwort.

enter image description here

aber eine Post-Anforderung im Terminal gibt mir einen Serverfehler

Für ex: für diese Seite https://play.google.com/store/apps/details?id=com.supercell.boombeach

curl -H "Content-Type: application/json" -X POST -d '{"id": "com.supercell.boombeach", "reviewType": '0', "reviewSortOrder": '0', "pageNum":'0'}' https://play.google.com/store/getreviews 

gibt einen Serverfehler und

Scrapy einfach ignoriert Diese Zeile:

frmdata = {"id": "com.supercell.boombeach", "reviewType": 0, "reviewSortOrder": 0, "pageNum":0} 
     url = "https://play.google.com/store/getreviews" 
     yield Request(url, callback=self.parse, method="POST", body=urllib.urlencode(frmdata)) 

Antwort

18

Vergewissern Sie sich, dass jedes Element in Ihrem formdata vom Typ string/Unicode ist

frmdata = {"id": "com.supercell.boombeach", "reviewType": '0', "reviewSortOrder": '0', "pageNum":'0'} 
url = "https://play.google.com/store/getreviews" 
yield FormRequest(url, callback=self.parse, formdata=frmdata) 

Ich denke, das

In [1]: from scrapy.http import FormRequest 

In [2]: frmdata = {"id": "com.supercell.boombeach", "reviewType": '0', "reviewSortOrder": '0', "pageNum":'0'} 

In [3]: url = "https://play.google.com/store/getreviews" 

In [4]: r = FormRequest(url, formdata=frmdata) 

In [5]: fetch(r) 
2015-05-20 14:40:09+0530 [default] DEBUG: Crawled (200) <POST  https://play.google.com/store/getreviews> (referer: None) 
[s] Available Scrapy objects: 
[s] crawler <scrapy.crawler.Crawler object at 0x7f3ea4258890> 
[s] item  {} 
[s] r   <POST https://play.google.com/store/getreviews> 
[s] request <POST https://play.google.com/store/getreviews> 
[s] response <200 https://play.google.com/store/getreviews> 
[s] settings <scrapy.settings.Settings object at 0x7f3eaa205450> 
[s] spider  <Spider 'default' at 0x7f3ea3449cd0> 
[s] Useful shortcuts: 
[s] shelp()   Shell help (print this help) 
[s] fetch(req_or_url) Fetch request (or URL) and update local objects 
[s] view(response) View response in a browser 
+0

Dank. Ich kann die Antwortdaten immer noch nicht sehen. Wie bekomme ich es? –

+2

response.body gibt Ihnen das komplette HTML-Element. Wenn Sie bestimmte Einträge machen möchten, können Sie 'response.xpath (YOUR_XPATH_HERE)' 'verwenden. – Jithin

+0

Thiis ist was ich bekomme auf r.body 'pageNum = 0 & id = com.supercell.boombeach & reviewType = 0 & reviewSortOrder = 0' –

0

Beispiel-Seite Verfahrgeschwindigkeit mit Beitrag in Scrapy tun:

def directory_page(self,response): 
    if response: 
     profiles = response.xpath("//div[@class='heading-h']/h3/a/@href").extract() 
     for profile in profiles: 
      yield Request(urljoin(response.url,profile),callback=self.profile_collector) 

     page = response.meta['page'] + 1 
     if page : 
      yield FormRequest('https://rotmanconnect.com/AlumniDirectory/getmorerecentjoineduser', 
             formdata={'isSortByName':'false','pageNumber':str(page)}, 
             callback= self.directory_page, 
             meta={'page':page}) 
    else: 
     print "No more page available" 
11

Die obige Antwort löst das Problem nicht wirklich. Sie senden die Daten als Parameter anstelle von JSON-Daten als Hauptteil der Anfrage.

Von http://bajiecc.cc/questions/1135255/scrapy-formrequest-sending-json:

my_data = {'field1': 'value1', 'field2': 'value2'} 
request = scrapy.Request(url, method='POST', 
          body=json.dumps(my_data), 
          headers={'Content-Type':'application/json'}) 
+0

Wie kann ich Anfragekörperergebnis erhalten? Ich benutze '' 'request.body''' es gibt mir Formulardaten zurück ... –

+1

Wenn Sie das Ergebnis der Anfrage wollen, müssen Sie es aus der Antwort bekommen. Die scrapy.Request kann ein "Callback" -Argument haben, das aufgerufen wird, wenn die Anfrage gejared wird ('yield request') und die Antwort empfangen wird. Um die Daten in der Callback-Funktion zu lesen (zum Beispiel: 'def parse_entry (self, response)') mach einfach response.body. Ich habe 'jsonresponse = json.loads (response.body_as_unicode())' verwendet, weil ich einen json bekomme – aitorhh