J'ai essayé de parcourir une liste d'URL pour obtenir l'URL de l'image de toutes les pages. Cependant, lors de l'utilisation de la boucle, la requête renvoie 400. Lorsque j'ai testé une URL individuelle, cela fonctionne (200). Échec depuis le premier appel.
J'ai essayé d'ajouter un délai, mais cela ne fonctionne toujours pas.
f = open(url_file) lineList = f.readlines() print(lineList[0]) # Test i = 1 for url in lineList: print(url) # Test -- the url is the same as lineList[0] above res = requests.get(url) # works when copied the printed url in but not as a variable
200 attendus - une erreur a donné 400
3 Réponses :
Utilisez urllib2 et changez l'adresse du fichier txt où les pages Web sont stockées:
exemple de source d'urls: http: / /mign.pl/ver.txt
200 200
output:
import requests import urllib.request as urllib2 response = urllib2.urlopen('http://mign.pl/ver.txt') x=response.read().decode("utf-8") d=x.split("\n") print(d) for u in d: res = requests.get(u) print(res.status_code)
Si votre fichier_url
comporte des sauts de ligne (caractère \ n
) comme séparateurs de ligne, cela peut entraîner une réponse erratique du serveur. En effet, \ n
n'est pas automatiquement supprimé de la fin de chaque ligne par f.readlines ()
. Certains serveurs ignoreront ce caractère dans l'URL et renverront 200 OK
, d'autres non.
Par exemple:
import requests with open(url_file) as f: list_of_urls = f.read().splitlines() # read file without line delimiters for url in list_of_urls: res = requests.get(url) print(res.status_code)
Sorties
['https://habr.com/en/users/\n', 'https://stackoverflow.com/users\n']
Si vous exécutez requests.get ()
sur ces URL exactes ci-dessus, vous recevrez 404
et 400 codes d'état HTTP respectivement. Sans \ n
à la fin, ce sont des pages Web existantes valides - vous pouvez le vérifier vous-même.
Vous n'avez pas remarqué ces \ n
supplémentaires dans votre code parce que vous avez utilisé print ()
sur chaque élément qui n'affiche pas ce symbole "explicitement" comme \ n
.
Comment réparer
Utilisez splitlines ()
au lieu de readlines ()
pour vous débarrasser de \ n
au fin:
f = open(r"C:\data\1.txt") # text file with newline as line separator list_of_urls = f.readlines() print(list_of_urls)
une autre option utilisant le générateur: exemple de source d'URL: http://mign.pl/ver.txt
import requests import urllib.request as urllib2 print(*(requests.get(u).status_code for u in urllib2.urlopen('http://mign.pl/ver.txt').read().decode("utf-8").split("\n")))
"Quand j'ai testé une URL individuelle" qu'est-ce que cela signifie exactement?
Il me semble que vous ajoutez une liste d'URL. Le premier dans le fichier peut être valide, mais est-ce (par exemple) le second? Toutes les lignes du fichier sont-elles une URL valide?
Pourriez-vous publier un échantillon de
lineList
?