Seite 1 von 1

kann nicht "googlen"

Verfasst: Sonntag 26. Juli 2009, 13:20
von INFACT
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!

Verfasst: Sonntag 26. Juli 2009, 13:53
von Defnull
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.

Verfasst: Sonntag 26. Juli 2009, 14:39
von INFACT
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

Verfasst: Sonntag 26. Juli 2009, 15:08
von 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: