Je suis nouveau dans la démolition Web et à des fins d'apprentissage, je veux trouver tous les liens href dans https://retty.me/ site Web. Mais j'ai trouvé que mon code ne trouve qu'un seul lien sur ce site. Mais j'ai vu la page source, elle a beaucoup de liens qui ne s'impriment pas. J'imprime également la pleine page où un seul lien contient. Qu'ai-je fait de mal?
S'il vous plaît corrigez-moi.
Voici mon code python:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
data=[]
html = urlopen('https://retty.me')
soup = BeautifulSoup(html,'lxml')
print(soup)
for link in soup.findAll('a', attrs={'href': re.compile("^https://")}):
data.append(link.attrs['href'])
file=open('scrapped_data.txt','w')
for item in data:
file.write("%s\n"%item)
file.close()
3 réponses
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é.
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)
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)