2016-06-29 12 views
-1

Ich habe einen sehr einfachen Crawler geschrieben, um zu überprüfen, ob eine Verbindung tot ist oder nicht bs4 verwendet. Ich möchte überprüfen, ob das Anker-Tag eine href hat oder nicht (auf diese Weise kann ich prüfen, ob die Verbindung aktiv ist oder nicht). Es gibt nur ein Ankerelement auf der Seite.Beautifulsoup4 - Versuchen, die Daten mit einer while-Schleife zu erhalten

Dies ist der Code:

import requests 
from bs4 import BeautifulSoup 

def check(): 
    url = 'https://somewebsite.net/' 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text,'html.parser') 
    for a in soup.findAll('a'): 
     href = a.get('href') 
     if href != '': 
      print('a') 
     else: 
      print('b') 
check() 

Dies funktioniert gut, aber ich möchte der Crawler alle paar Sekunden, um die Website zu halten überprüfen. Ich habe versucht, dies mit einer unendlichen While-Schleife zu implementieren, aber ich habe keine Ergebnisse erhalten.

while True: 
    check() 

Ich möchte wissen, warum dies nicht funktioniert hat und mögliche Lösungen.
Danke.

+0

Erhalten Sie einen Fehler, wenn Sie eine Weile warten? Möglicherweise warten Sie auf "Anforderungen", um eine Zeitüberschreitung zu erhalten, und treffen das Wiederholungslimit, das konfiguriert werden kann. Zusätzlich können Sie einen "request.head" ausführen, um nur eine Kopfanfrage zu erhalten, um den Statuscode zu überprüfen, wenn Sie nur interessiert sind, ob es lebendig oder tot ist. Das Gleiche gilt wie oben. – sytech

+0

@GadaaDhaariGeek Das Anchor-Tag hat ein href-Attribut und kein src-Attribut. –

Antwort

3

Es ist schwer, ohne zu sagen, zu wissen, welche Website Sie versuchen, Tags auf zu überprüfen, aber zumindest von einem Code-Standpunkt, sollten Sie wahrscheinlich not a.has_attr('href') tun, anstatt a.get('href') != '' wenn Ihr Ziel zu sehen ist, wenn der Anker jeden href hat Attribut überhaupt.

Auch sieht es so aus, als ob Sie für Ihre if Anweisungen Teil Ihrer for-Schleife sein könnten.

import requests 
from bs4 import BeautifulSoup 

def check(): 
    url = 'https://somewebsite.net/' 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text,'html.parser') 
    for a in soup.findAll('a'): 
     if a.has_attr('href'): 
      print('b') 
     else: 
      print('a') 
check() 

Sie werden wahrscheinlich auch ein wenig schlafen wollen, um alle paar Sekunden zu überprüfen, anstatt ständig.

import time 
... 
while True: 
    time.sleep(5) # sleep for 5 seconds 
    check() 
+0

Ich denke, 'if' Anweisung sollte der Teil von' for' Schleife sein. Dann kann nur er nach jedem ''-Tag suchen. – GadaaDhaariGeek

+0

Ja, ich entschuldige mich für den Fehler in der for-Schleife (behoben). Ich habe versucht, das Schlaf-Ding, aber das hat auch nicht funktioniert. –

+0

Ich habe versucht, dies in einer for-Schleife ausgeführt, die für 50 mal iteriert, das schien zu arbeiten, aber es funktioniert nicht mit der While-Schleife –

0

a.get('href') nie auf eine leere Zeichenfolge gleich sein, wird es Keine sein, wenn der Anker keine href hat, so dass Sie, wenn nie auf True auszuwerten.

Wenn nur ein Anker ist dann nur return soup.find("a", href=True), wenn ein Anker mit einem href ist, werden Sie den Anker bekommen, wenn nicht, werden Sie keine bekommen,

import requests 
from bs4 import BeautifulSoup 
from time import sleep 

def check(): 
    url = 'https://somewebsite.net/' 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text,'html.parser') 
    return soup.find("a", href=True) 


while True: 
    a = check() 
    if a: 
     # do whatever 
    sleep(10) 
Verwandte Themen