2017-06-09 3 views
0

Ich habe ein kleines Skript zum Sammeln von Daten aus einer Liste von Websites. Ich habe lynx dafür verwendet, aber nachdem ich die Daten durchgegangen bin, bemerkte ich, dass einige Seiten keine Ergebnisse zurückgaben.Ziehen von Daten aus einer Liste von Websites mit BeautifulSoup

#!/bin/bash 

[ "$1" ] || exit 1 

tmp=$(mktemp "${1}_XXXXXXXXX") 

cat <<EOF > "$tmp" 
https://google.com/search?q=${1} 
https://duckduckgo.com/?q=${1} 
https://www.bing.com/search?q=${1} 
EOF 

while read; do 

    lynx -nonumbers -dump -hiddenlinks=merge -listonly "$REPLY" | \ 
    grep -i "${1}" | awk '!x[$0]++' >> file.txt 

done < "$tmp" 

rm "$tmp" 

Es stellt sich heraus, es ist ein Zertifikat Validierungsproblem. Und anscheinend lynx hat kein Flag, um die Validierung zu ignorieren. Obwohl ich weiß, dass Validierung das allerbeste Interesse ist, muss ich in der Lage sein, Daten von jeder Website in meiner Liste zu ziehen.

Also habe ich stattdessen mit Python und BeautifulSoup untersucht. Von this answer Ich bin in der Lage, die Links von einer einzigen URL zu ziehen. Und von this answer Validierung ignorieren.

Python 3.6, das ist, was ich bisher habe:

from bs4 import BeautifulSoup 
import urllib.request 
import ssl 

ctx = ssl.create_default_context() 
ctx.check_hostname = False 
ctx.verify_mode = ssl.CERT_NONE 

resp = urllib.request.urlopen('https://google.com', context=ctx) 
soup = BeautifulSoup(resp, "lxml") 

for link in soup.find_all('a', href=True): 
    print(link['href']) 

Ich mag die gleiche Liste zu übergeben, die an den Python-Skript in dem Bash-Skript ist die Links von jedem des URLs zu ziehen In der Liste. So im Wesentlichen, die jeweils Zeile dieser Liste

https://google.com/search?q=${1} 
https://duckduckgo.com/?q=${1} 
https://www.bing.com/search?q=${1} 

würde als URLS-resp = urllib.request.urlopen('URLS', context=ctx) geben bekommen

Wie kann ich das tun?

+0

Was genau möchten Sie tun? Wo gibst du die Liste der Seiten weiter? – user3764893

+0

Ich versuche, die gleiche Funktionalität wie das Bash-Skript zu bekommen. Ich kenne Python überhaupt nicht. Das meiste von dem, was ich weiß, habe ich heute gelernt. Ich versuche, das Python-Skript die gleiche Liste wie das Bash-Skript zu lesen. –

+0

Sie können eine Schleife verwenden, die durch Ihre Liste iteriert, den Link öffnet und analysiert. Würde das nicht funktionieren? – user3764893

Antwort

1

Versuchen Sie die Python-String-Formatierung.

'https://google.com/search?q=%s' % ('text',) ergibt 'https://google.com/search?q=text', wenn das, was Sie suchen

+0

Vielen Dank für Ihre Hilfe. –

1

die Site-Namen lesen, können aus einer Liste sagen, durchlaufen sie, Anfrage senden und die Antwort zu analysieren.

site_list = ['http://example.com', 'https://google.com'] 

for site in site_list: 

    resp = urllib.request.urlopen(site) 
    soup = BeautifulSoup(resp, "lxml") 

    for link in soup.find_all('a', href=True): 
     print(link['href']) 
+0

Danke, das war hilfreich. –

Verwandte Themen