2017-09-13 8 views
1

J'écris une fonction dans aws-lambda. La fonction est simple. Il obtient juste la demande de site Web spécifique.Le résultat de urllib2 diffère de celui d'un navigateur Web

La fonction Lambda dans python2 est comme ci-dessous. import urllib2 est également inclus.

def lambda_handler(event, context): 
    # TODO implement 
    url = "https://www.amazon.co.jp/s/field-keywords=4548967337259" 
    response = urllib2.urlopen(url) 
    #print response 

    return response.read() 

Je prends la valeur retournée à mon serveur ruby on rails et essayé d'analyser pour les informations nécessaires.

Sur le site Web, l'étiquette et les informations relatives sont montrées comme ci-dessous.

<a class="a-link-normal a-text-normal" target="_blank" 
rel="noopener" href="https://www.amazon.co.jp/GOTHAM- 
%E3%82%B5%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%BC%E3%82%BA%E3%83%B3- 
%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4- 
%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88- 
%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-Blu-ray/dp/B071K5VZTL/ref=sr_1_1? 
ie=UTF8&amp;qid=1505293516&amp;sr=8-1&amp;keywords=4548967337259"> 

Cependant, si je prends response et utilise read() méthode pour transférer, il ressemble à ceci.

<a class=\"a-link-normal a-text-normal\" target=\"_blank\" rel=\"noopener\" 
href=\"https://www.amazon.co.jp/GOTHAM-%E3%82%B5%E3%83%BC%E3%83%89- 
%E3%82%B7%E3%83%BC%E3%82%BA%E3%83%B3- 
%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4- 
%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88- 
%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-Blu-ray/dp/B071K5VZTL\"> 

Pourquoi cela se produit-il et comment puis-je éviter cela?

En fait, j'ai essayé quelque chose comme response.json() mais il n'a pas été en mesure de faire la forme json entièrement.

Répondre

1

Essayez de passer un en-tête User-Agent:

import urllib2 

def lambda_handler(...): 
    request = urllib2.Request("http://www.google.com", 
          headers={"User-Agent" : "Mozilla/5.0"}) 
    return urllib2.urlopen(request).read() 
+0

pouvez-vous expliquer la différence avec les en-têtes et sans elle? –

+0

@ jh.shin vous pouvez "tromper" le serveur en pensant que vous êtes un navigateur Web. Sans cela, il semble que cela vous servira un contenu différent. –

0

Vous devez passer la réponse à la fonction de chaîne:

def lambda_handler(event, context): 
    url = "https://www.amazon.co.jp/s/field-keywords=4548967337259" 
    response = urllib2.urlopen(url) 
    return str(response.read()) #here, casting as a string 
+0

Quelle est la grande différence entre 'response.read()' et le transformer en chaîne? –