3 réponses

Meilleure réponse

Si vous entrez le message affiché dans le html, vous entrez dans google translate, il dit "Nous nous excusons pour votre problème". Ils ne veulent pas que les gens grattent leur site, ils filtrent donc les demandes en fonction de l'agent utilisateur. Il vous suffit d'ajouter un agent utilisateur à l'en-tête de demande qui ressemble à un navigateur.

from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
import re

data=[]

url = 'https://retty.me'
req = Request(
    url, 
    data=None, 
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
    }
)
html = urlopen(req)
soup = BeautifulSoup(html,'lxml')
print(soup)
for link in soup.findAll('a', attrs={'href': re.compile("^https://")}):
    data.append(link.attrs['href'])

for item in data:
    print(item)

En fait, ce site particulier ne nécessite que la présence de l'en-tête de l'agent utilisateur et acceptera tout agent utilisateur, même une chaîne vide. La bibliothèque de requêtes mentionnée par Rishav fournit un agent utilisateur par défaut, c'est pourquoi elle fonctionne sans y ajouter d'en-tête personnalisé.

1
Kris 16 avril 2018 à 13:35

Je ne sais pas pourquoi le site Web renvoie un code HTML différent lorsqu'il est utilisé avec urllib, mais vous pouvez utiliser l'excellente bibliothèque requests qui est beaucoup plus facile à utiliser que urllib de toute façon.

from bs4 import BeautifulSoup
import re
import requests

data = []
html = requests.get('https://retty.me').text
soup = BeautifulSoup(html, 'lxml')
for link in soup.findAll('a', attrs={'href': re.compile("^https://")}):
    data.append(link.attrs['href'])
print(data)
1
xrisk 16 avril 2018 à 13:30

Vous pouvez trouver la documentation officielle pour les demandes ici et pour Beautiful Soup ici.

import requests
from bs4 import BeautifulSoup

# your Response object called response
response = requests.get('https://retty.me')

# your html as string
html = response.text

#verify that you get the correct html code
print(html)

#make the html, a soup object
soup = BeautifulSoup(html, 'html.parser')

# initialization of your list
data = []

# append to your list all the URLs found within a page’s <a> tags
for link in soup.find_all('a'):
    data.append(link.get('href'))

#print your list items
print(data)
0
gtopal 16 avril 2018 à 16:13