2017-07-07 6 views
0

So habe ich durch Al Sweigart Online-Automatisierung der langweilig Stuff With Python Tutorials gearbeitet, und ich habe gerade zum Webscraping Teil. Hier ist mein Code mit einer Beschreibung dessen, was das Programm tun soll:Grundlegende Webscraping mit Python (Schöne Suppe und Anfragen)

#! python3 
# lucky.py - A small program that allows you to get search keywords from 
# command line arguments, retrieve the search results page, and open 
# a new browser tab for each result 

# Steps: 
# 1. Read the command line arguments from sys.argv 
# 2. Fetch the search result page with the requests module 
# 3. Find the links to each search result 
# 4. Call the webbrowser.open() function to open the web browser 

import sys, requests, bs4, webbrowser 

# 1. Read the command line arguments from sys.argv 

print('Googling...') 

if len(sys.argv) > 1: 
    search = ' '.join(sys.argv[1:]) 

url = "https://www.google.com/#q=" 

for i in range(len(search.split())): 
    url += search.split()[i] + "+" 

# 2. Fetch the search result page with the requests module 

page = requests.get(url) 

# 3. Find the links to each search result 

soup = bs4.BeautifulSoup(page.text, 'lxml') 
linkElems = soup.select('.r a') 

# 4. Call the webbrowser.open() function to open the web browser 

numOpen = min(5, len(linkElems)) 
for i in range(numOpen): 
    webbrowser.open("http://google.com" + linkElems[i].get('href')) 

Also hier das Problem ist, dass, wenn ich die Länge linkElems überprüfen, es 0 ist, was bedeutet, dass die soup.select (‘r ein. Der Befehl '' konnte den unter Element < definierten Inhalt nicht zusammenfassen. a> Inside class = r (eine Klasse, die nur für Suchergebnisse in Google verwendet wird, wie bei Verwendung der Entwicklertools zu sehen ist). Dadurch öffnen sich in meinem Browser keine Webseiten der Suchergebnisse.

Ich denke, das Problem hat etwas zu tun, entweder mit dem HTML-Parser nicht richtig funktioniert, oder Google ändert die Art, wie ihre HTML-Code funktioniert (?). Jeder Einblick in dieses Problem würde sehr geschätzt werden!

+1

Sie suchen also ein Ankerelement? Es ist durchaus möglich, dass Google den Inhalt, den sie bedienen, geändert hat, sodass Sie auf diese Weise nicht mehr das finden, wonach Sie suchen. Sie müssen sich ihren Quellcode ansehen und prüfen, welches Tag die gewünschten Informationen enthält, und dann das extrahieren. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Ja, genau. Das Lustige daran ist, dass Google nach Überprüfung des Quellcodes immer noch class = r für Suchergebnisse und Ankerelemente unter denen für entsprechende Links verwendet. Ich werde mehr auf die Quelle eingehen und sehen, ob es ein anderes wichtiges Problem gibt. Danke für den Kommentar! – Rohan

+1

Es ist durchaus möglich, dass das dann über JS geladen wird ... vielleicht müssen Sie Phantomjs oder Selen betrachten. Viel Glück! –

Antwort

0

Dies gibt alle relevanten <a> Tags zurück und Sie können die Liste bearbeiten, um zu entscheiden, was Sie behalten und was nicht.

+0

Während dies viele Links zurückgibt, sind sie leider alle Links zu den anderen Teilen von Google wie Bilder, Videos, Einstellungen, etc ... Ich druckte die resultierende Liste aus und keiner der href-Werte scheint Suchergebnis zu sein URLs. Danke für die Antwort trotzdem! – Rohan

0

Google scheint zu erkennen, dass Sie ein Bot und kein richtiger Webbrowser mit Cookies und Javascript sind. Was sie mit den neuen Ergebnissen zu tun scheinen, ist immer noch, dass die Web-Scraper den von ihnen bereitgestellten Links folgen und ihnen https://www.google.com voranstellen, damit sie Ihre Bewegung immer noch verfolgen können, wenn Sie dann zu dieser URL gehen.

Sie könnten auch versuchen, ein Muster in dem bereitgestellten Link zu finden. Zum Beispiel, wenn Sie für 'Linux' suchen, gibt es die folgenden: '?/Url q ='

/url?q=https://en.wikipedia.org/wiki/Linux&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=9775308e-206b-11e8-b45f-fb72cae612a8 
/url?q=https://www.linux.org/&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=9775308e-206b-11e8-b45f-fb72cae612a8 
/url?q=https://www.linux.com/what-is-linux&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=d50ea51a-206b-11e8-9432-2bee635f8337 
/url?q=https://www.ubuntu.com/&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=dab9f6a4-206b-11e8-a999-3fc9d4576425 
/search?q=linux&ie=UTF-8&prmd=ivns&source=univ&tbm=nws&tbo=u&sa=X&ved=9775308e-206b-11e8-b45f-fb72cae612a8 

Sie einen regulären Ausdruck verwenden, könnte das Teil zwischen greifen und '& sa = U & ved =' wie das ist die URL, die Sie wahrscheinlich möchten. Das funktioniert natürlich nicht mit dem 5. Ergebnis, das zurückgegeben wurde, weil es etwas Besonderes für die Google-Website ist. Auch hier ist es wahrscheinlich am sichersten, wenn Sie die Nummer https://www.google.com auf der Vorderseite jeder zurückgegebenen URL anheften.

Die meisten Suchmaschinen (auch duckduckgo.com) versuchen, Suchergebnisse und Klicks zu verfolgen. Wenn Sie versuchen, es zu vermeiden, haben sie einen Erkennungscode, um Sie zu blockieren. Möglicherweise haben Sie mit Google darauf gestoßen, dass Sie eine große Anzahl von Suchanfragen von Ihrer IP-Adresse aus gesehen haben und Sie einen CAPTCHA-Test durchführen müssen, um fortzufahren.