J'essaie d'utiliser Python Requests via PHP pour scraper une page
index.php :

<?php
$url = $_GET['url'];
$output = shell_exec("python /home/myusername/public_html/py/fetch.py $url");
echo $output;

Et voici mon fetch.py :

#! /usr/bin/python

import requests
import sys

url = sys.argv[1]

headers = {'cache-control': 'no-cache'}

try:
    r = requests.request("GET", url, headers=headers)
    #print r.status_code
    #sys.exit(1)
except requests.exceptions.RequestException as e:
    print e
    sys.exit(1)

if not r.text:
    print("Response Empty")
else:
    print(r.text)

J'ai essayé de vérifier le code d'état, c'est 200. J'ai essayé de vérifier si la réponse est vide, ce n'est pas le cas. Mais r.text ne s'imprime pas du tout. Qu'est-ce que je fais mal ici?

0
Sukhchain Singh 18 mars 2019 à 10:49

2 réponses

Meilleure réponse

Selon la documentation officielle il y a des captures incluses dans shell_exec

Vous devrez peut-être mettre à jour votre code un peu. Il y a des chances que vous ayez une erreur dans votre code, qui est essentiellement redirigé vers stderr et donc non capturé dans le stdout. Pour en savoir plus lire ceci

Revenons donc à votre question. Modifiez votre code

<?php
$url = $_GET['url'];
$output = shell_exec("python /home/myusername/public_html/py/fetch.py $url 2>&1");
echo $output;
?>

Mettez à jour le code Python pour :

#! /usr/bin/python

import requests
import sys

url = sys.argv[1]

headers = {'cache-control': 'no-cache'}

try:
    r = requests.request("GET", url, headers=headers)
    #print r.status_code
    #sys.exit(1)
except requests.exceptions.RequestException as e:
    print e
    sys.exit(1)

if not r.text:
    print("Response Empty")
else:
    print(r.text.encode('utf-8')) # changes
1
Ja8zyjits 18 mars 2019 à 08:07

En essayant de cette façon :

shell_exec("python /home/myusername/public_html/py/fetch.py ​​$url 2>&1");

Vous pouvez voir les erreurs dans le script python que vous avez.

1
zvi 18 mars 2019 à 08:07