kann nicht "googlen"

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich kann weder mit google, noch mit bing "googlen":

Code: Alles auswählen

# -*- coding: cp1252 -*-
import urllib, urllib2
import cookielib
import sys, urllib2, re, sets, random, httplib, time, socket
from BeautifulSoup import BeautifulSoup



def google(query):
    
    counter =  10  # um die Seitenzahl zu erhöhen
    urls = []
    cj = cookielib.CookieJar()
    
    while counter < 11:

        #Die url zum googlen
        url = 'http://www.google.com/search?hl=en&q=' \
              +query+'&hl=en&lr=&start='+repr(counter)+'&sa=N'
        
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

        #Die haeder dazudichten
        opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)'),
                         ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
                         ("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3"),
                         ("Accept-Encoding", "gzip,deflate"),
                         ("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"),
                         ("Keep-Alive", "300"),
                         ("Connection", "keep-alive")]
        
        data = opener.open(url).read()
        # Der teil ist nicht von mir:

        
        hosts = re.findall(('\w+\.[\w\.\-/]*\.\w+'),StripTags(data))
        #Lets add sites found to a list if not already or a google site.
        #We don't want to upset the people that got our list for us.
        for x in hosts:
            if x.find('www') != -1:
                x = x[x.find('www'):]
            if x not in urls and re.search("google", x) == None:
                urls.append(x)
        counter += 10
        
    return urls

def bing(query):

    cj = cookielib.CookieJar()
    
    pos = 1 #Um die seitenzahl zu erhoehen
    urls = []
    tmp_urls1 = []
    tmp_urls2 = []
    while 1:
        url = "http://www.bing.com/search?q=" + query + "&first=" + str(pos)
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)'),
                         ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
                         ("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3"),
                         ("Accept-Encoding", "gzip,deflate"),
                         ("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"),
                         ("Keep-Alive", "300"),
                         ("Connection", "keep-alive")]
        
        html = opener.open(url).read() #Sollte html ergeben

        #Zum debuggen - schaut selbst mal was da für muell herauskommt
        a = open("bing.html", "w")
        a.write(html)
        a.close()
        # -
        
        soup = BeautifulSoup(html)
        # Um die links zu filtern 
        for x in soup.findAll("a"):
            
            #Nicht eigene links nehmen
            if not "bing" in x and not "ms" in x and not "microsoft" in x:
                tmp_urls1.append(x)
                
        for x in tmp_urls1:
            if not x in urls:
                urls.append(x)

        #Prüfen ob diese Seite schon benutzt wurde - anhand der links:
        # Sind es die gleichen wie auf der letzten seite?
        if tmp_urls1 == tmp_urls2 != []: break
        tmp_urls2 = tmp_urls1
        tmp_urls1 = []

        #Position um 10 erhoehen, damit die naechste seite angwzeigt wird
        pos += 10

bing("site:python.org")
google("site:python.org")    
Wo ist der unterschied zwischen den funktionen und den sachen die ein browser macht? Ist das irgentwie verboten oder warum geht das nicht?

Bitte klärt mich auf!
für vorschläge bin ich offen!
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ja, es ist verboten. Dafür gibt es ne API für die du dir nicht einmal einen API-Key registrieren musst.

http://code.google.com/intl/de/apis/aja ... I_Overview

Damit bekommst du aber auch gleich sauberes json und viel mehr infos :)

Tipp: Soweit ich das sehe ist das json dieser API sogar weitgehend python-eval() kompatibel.
Bottle: Micro Web Framework + Development Blog
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich verstehe nicht so ganz was dieses json bringt.
Ich kann das gleiche ergebnis mit

Code: Alles auswählen

import urllib2; urllib2.urlopen(url).read()
erzielen?

Ps: mein 200 post xD
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
lunar

Das Ergebnis dieser Zeile sind Bytes, insofern erzielt jeder Netzwerkverkehr das gleiche Ergebnis.

Wenn du damit meinst, ob du damit ebenfalls HTML erhältst: Nein, du erhältst ein anderes Markup-Format namens JSON, welches mittels simplejson in native Python-Datenstrukturen geparst werden kann, ganz ohne umständliches HTML-Parsen.

Das ist aber nichts, was dir nicht auch die Dokumentation, Wikipedia und vor allem auch das Ausprobieren im interaktiven Interpreter verraten hätten. :roll:
Antworten