1
votes

request.get renvoie 400 réponses lors de la boucle - même si l'URL est toujours la même

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 commentaires

"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 ?


3 Réponses :


0
votes

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)


0 commentaires

1
votes

Explication

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)


0 commentaires

0
votes

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


0 commentaires