2017-07-17 2 views
0

Je souhaite obtenir des données de this site.Python-demandes me donner une réponse différente de ce que je vois dans le navigateur, pourquoi?

Lorsque j'obtiens des données de l'URL principale. Je reçois un fichier HTML qui contient la structure mais pas les valeurs.

import requests 
from bs4 import BeautifulSoup 

url ='http://option.ime.co.ir/' 
r = requests.get(url) 
soup = BeautifulSoup(r,'lxml') 
print(soup.prettify()) 

Je trouve que le site de valeurs auprès

url1 = 'http://option.ime.co.ir/GetTime' 
url2 = 'http://option.ime.co.ir/GetMarketData' 

Quand je regarde les réponses de ces URL dans le navigateur. Je vois une réponse au format JSON et l'heure dans un format spécifique. Mais quand j'utilise des requêtes pour obtenir les données, cela me donne le même HTML que celui que j'ai obtenu de url.

Savez-vous quelle est la raison? Comment devrais-je obtenir les réponses que je vois dans le navigateur?

Je vérifie les en-têtes pour toutes les URL et je n'ai pas trouvé quelque chose de spécial que je devrais envoyer avec ma demande.

+0

Comment pouvez-vous dire que les en-têtes ne sont pas utiles? Tout est à propos des trucs des en-têtes. –

+0

Vérifiez si le champ User-Agent est différent. Vous pouvez généralement obtenir des réponses différentes en fonction du type de client. – thorhunter

+0

@Ujival Je n'ai pas dit les en-têtes ne sont pas utiles, j'ai dit que je ne trouve rien d'utile :) – Mehdi

Répondre

0

Vous devez fournir les en-têtes HTTP appropriés dans la demande. Dans mon cas, j'ai réussi à le faire en utilisant les en-têtes suivants. Notez que dans mes tests, la réponse HTTP était un 200 OK plutôt qu'une redirection vers le site Web racine (comme si aucun en-tête HTTP n'était fourni dans la requête).

requête HTTP Raw:

GET http://option.ime.co.ir/GetTime HTTP/1.1 
Host: option.ime.co.ir 
Referer: "http://option.ime.co.ir/" 
Accept: "application/json, text/plain, */*" 
User-Agent: "Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0" 

Cela devrait vous donner la réponse appropriée JSON dont vous avez besoin.

+0

Non, j'essaie d'ajouter ces requêtes http à mon résultat de requête get est le même que précédemment.J'utilise l'extension Postman et python les deux ne m'ont pas donné JSON. – Mehdi

0

Votre première connexion à l'aide du navigateur reçoit une réponse de redirection 302 (à la même URL).

Ensuite, il exécute quelques JS de sorte que la deuxième demande ne redirige plus et obtient le JSON attendu.

C'est une technique habituelle pour que les autres utilisateurs n'utilisent pas leur API sans autorisation.

Activez la case à cocher "Conserver le journal" dans les dev. outils pour que vous puissiez le voir par vous-même.

+0

Y at-il un moyen d'obtenir ces données? Je définis la case à cocher "Conserver le journal" mais rien ne change – Mehdi

+0

Définissez le journal de conservation, puis actualisez toutes les requêtes sur le serveur Non, le serveur a la même politique d'origine, donc à moins d'utiliser un proxy, il n'y a aucun moyen de – JuanGG