2015-05-20 6 views
13

Sto tentando di eseguire la scansione delle ultime recensioni da google play store ma ho bisogno di fare una richiesta per ottenere le ultime recensioni.Invia richiesta messaggio in Scrapy

Con il postino funziona e ottengo risposta desiderata.

enter image description here

ma una richiesta POST in terminale mi dà un errore del server

Per es: questa pagina 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 

dà un errore del server e

Scrapy solo ignora questa riga:

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)) 

risposta

18

Assicurarsi che ogni elemento del formdata è di tipo stringa/unicode

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) 

Penso che questo farà

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

Grazie. Non riesco ancora a vedere i dati di risposta. Come ottenerlo? –

+2

response.body ti darà l'elemento html completo. Se vuoi prendere alcune voci specifiche puoi usare 'response.xpath (YOUR_XPATH_HERE)'. – Jithin

+0

Thiis è quello che sto ottenendo su r.body 'pageNum = 0 & id = com.supercell.boombeach & reviewType = 0 & reviewSortOrder = 0' –

0

Pagina di esempio di movimento utilizzando Share Scrapy:

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

La risposta sopra non ha veramente risolto il problema. Stanno inviando i dati come parametri anziché dati JSON come corpo della richiesta.

Da 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

Come posso ottenere il risultato del corpo della richiesta? Io uso '' 'request.body''' mi restituisce i dati del modulo ... –

+1

Se vuoi il risultato della richiesta, devi ottenerlo dalla risposta. Scrapy.Request può avere un argomento di 'callback' che verrà chiamato se la richiesta è yieled ('request request') e la risposta è ricevuta. Per leggere i dati nella funzione di callback (ad esempio: "def parse_entry (self, response)") basta fare response.body. Ho usato 'jsonresponse = json.loads (response.body_as_unicode())' perché ottengo un json – aitorhh