Mechanize Fehler bei addheaders

Django, Flask, Bottle, WSGI, CGI…
Antworten
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Hallo Freunde,
Ich versuche mich grade an das Modul Mechanize, nur leider bekomme ich eine Fehlermeldung:

Code: Alles auswählen

import mechanize

br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders[("User-agent", "Mozilla/5.0")
br.open('www.google.de')
br.select_form(nr=0)
br.form['q'] = 'test'
sub = br.submit()
print(sub.geturl())

Fehlermeldung:
line 5, in <module> br.addheaders[("User-agent", "Mozilla/5.0")]
TypeError: list indices must be integers, not tuple

Ist doch eighendlich richtig ? Er soll auf google gehen und test suchen mir die url dann ausgeben ? :x :x
Zuletzt geändert von Anonymous am Sonntag 25. Juni 2017, 17:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nein, das ist nicht richtig. Einen einzelnen Header kannst du so setzen:

Code: Alles auswählen

br.add_header("User-agent", "Mozilla/5.0")
Und im Falle von addheaders ist dies der richtige Weg:

Code: Alles auswählen

br.addheaders = [("User-agent", "Mozilla/5.0")]
Du benötigst also eine Zuweisung mittels Gleichheitszeichen. Was du machst, ist eine Abfrage. Und Listen lassen sich - wie die Fehlermeldung schon sagt - sowieso nicht mit Tupeln abfragen, sondern nur mit Integern via Listenindex.
Zuletzt geändert von snafu am Sonntag 25. Juni 2017, 17:04, insgesamt 1-mal geändert.
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Code: Alles auswählen

import mechanize


br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders("User-agent", "Firefox")
br.open('www.google.de')
br.select_form(nr=0)
br.form['q'] = 'test'
sub = br.submit()
print(sub.geturl())

Fehlercode

line 6, in <module>
br.addheaders("User-agent", "Firefox")
TypeError: 'list' object is not callable
Zuletzt geändert von Anonymous am Sonntag 25. Juni 2017, 17:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Okay vielen dank mal so neben bei was sind diese headers?
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Funktioniert aber auch nicht ...

Code: Alles auswählen

import mechanize


br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [("User-agent", "Mozilla/5.0")]
br.open('www.google.de')
br.select_form(nr=0)
br.form['q'] = 'test'
sub = br.submit()
print(sub.geturl())
C:\Python27\python.exe C:/Users/Admin/PycharmProjects/Maker/Maker.py
Traceback (most recent call last):
File "C:/Users/Admin/PycharmProjects/Maker/Maker.py", line 7, in <module>
br.open('www.google.de')
File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 203, in open
return self._mech_open(url, data, timeout=timeout)
File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 216, in _mech_open
"can't fetch relative reference: "
mechanize._mechanize.BrowserStateError: can't fetch relative reference: not viewing any document

Process finished with exit code 1
Zuletzt geändert von Anonymous am Sonntag 25. Juni 2017, 17:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

phoenixx592 hat geschrieben:mal so neben bei was sind diese headers?
Header liefern verschiedene Informationen an den Server. Der User-Agent sagt dem Server, welches Programm zur Verarbeitung der Daten verwendet wird, in deinem Fall ist es ein Browser (genau genommen: Firefox).
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Okay danke hab ich mir schon fast gedacht.

aber ich bekomme immernoch die fehlermeldung ... gibt es nicht irgendwo ne gute Lektüre über mechanize bzw. HTTP requests?

Code: Alles auswählen

import mechanize


br = mechanize.Browser()
br.set_handle_robots(False)
br.add_header("User-agent", "Mozilla/5.0")
br.open('www.google.de')
br.select_form(nr=0)
br.form['q'] = 'test'
sub = br.submit()
print(sub.geturl())
AttributeError: mechanize._mechanize.Browser instance has no attribute add_header (perhaps you forgot to .select_form()?)
Zuletzt geändert von Anonymous am Sonntag 25. Juni 2017, 17:16, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@phoenixx592: Die Dokumentation sagt, dass die Methode set_header() heisst.
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Aller Anfang ist schwer,
wie würdet ihr den das Skript schreiben... bei mir funktioniert in Sachen Mechanize echt garnichts :? :? :? :?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Bei mir funktioniert es so:

Code: Alles auswählen

def get_google_search_url(query):
    br = mechanize.Browser()
    br.set_handle_robots(False)
    br.addheaders = [('User-agent', 'Mozilla/5.0')]
    br.open('http://www.google.com/')
    br.select_form(nr=0)
    br.form['q'] = query
    br.submit()
    return br.geturl()

def main():
    print(get_google_search_url('test'))

if __name__ == '__main__':
    main()
Dass Robots durch Google verboten wurden, sollte dir aber zu denken geben, ob es nicht einen anderen Weg gibt, um die URL zu erhalten...
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was genau hast du denn vor? Willst du die Google-Suche auf einer Webseite integrieren? Dann könnte Google Custom Search für dich interessant sein:
Mit der benutzerdefinierten Suche von Google wird zu Ihrer Startseite ein Suchfeld hinzugefügt, damit Nutzer benötigte Informationen auf Ihrer Website schneller finden.
https://cse.google.com/cse/
BlackJack

@phoenixx592: Naja, *richtig* würde ich es schreiben. Weil sonst funktioniert es ja nicht. ;-)

Ein anderer Fehler den Du gemacht hast ist das Argument von `Broser.open()`. Das muss eine URL sein. Du möchtest da vielleicht mit 'http://' oder so anfangen damit das eine URL wird.
BlackJack

@snafu: Ich würde ja `set_header()` benutzen, statt den alten Wert von `addheaders` einfach so zu überschreiben.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

set_header() führt leider bei mir zu dem AttributeError, den der OP hier bereits gezeigt hat. Kann sein, dass ich eine veraltete Version von mechanize verwende...

EDIT:
Jepp, ich hatte mechanize 0.2.5 drauf. Ein Upgrade auf die Version 0.3.5 hat die Fehlermeldung beseitigt.
phoenixx592
User
Beiträge: 66
Registriert: Sonntag 25. Juni 2017, 16:41

Dass Robots durch Google verboten wurden, sollte dir aber zu denken geben, ob es nicht einen anderen Weg gibt, um die URL zu erhalten...
was soll das heißen das es durch Google verboten wurde? :D

Danke für den Code funktioniert super, das soll nur ein reiner Lerneffekt sein. :wink:
BlackJack

@phoenixx592: Das soll heissen das Google das in der `robots.txt` verbietet und es bei Dir nur funktioniert weil Du Dich mit ``br.set_handle_robots(False)`` über dieses Verbot hinweg setzt.
Antworten