Vinnaren i pepparkakshustävlingen!
2015-11-07, 23:23
  #1
Medlem
Alkyonioss avatar
Postade min fråga i tråden för nybörjarfrågor tidigare i veckan men då jag inte fått något svar där skapar jag en tråd istället i hopp om att få svar här istället.

--------------------------------------------------------------------------------

Försökte följa denna guide för att göra en s.k. Web Crawler.

Grejen är bara den att jag har skrivit av koden EXAKT. Jag har även döpt min fil till EXAKT samma som den som skrev texten.
Jag har sedan lagt filen i C:/Python34, precis som den som skrev texten (med undantag av att författaren hade Python32.

När jag sedan ska kalla min funktion skriver jag exakt samma sak som författaren i Python IDLE, men jag får lik förbannat felet:

Kod:
Traceback (most recent call list):
    File "<pyshell#2>", line 1, in <module>
        spider("http://www.dreamhost.com", "secure", 200)
NameError: name 'spider' is not defined

Mitt funktionsanrop:
Kod:
spider("http://www.dreamhost.com", "secure", 200)

All kod:
Kod:
from html.parser import HTMLParser
from urllib.request import urlopen
from urllib import parse

class LinkParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        if tag == 'a':
            for (key, value) in attrs:
                if key == 'href':
                    newUrl = parse.urljoin(self.baseUrl, value)
                    self.links = self.links + [newUrl]

    def getLinks(self, url):
        self.links = []
        self.baseUrl = url
        response = urlopen(url)
        if response.getheader('Content-Type') == 'text/html':
            htmlBytes = response.read()
            htmlString = htmlBytes.decode("utf-8")
            self.feed(htmlString)
            return htmlString, self.links
        else:
            return "", []

    def spider(url, word, maxPages):
        pagesToVisit = [url]
        numberVisited = 0
        foundWord = 0
        while numberVisited < maxPages and pagesToVisit != [] and not foundWord:
            numberVisited = numberVisited + 1
            url = numberVisited + 1
            url = pagesToVisit[0]
            pagesToVisit = pagesToVisit[1:]
            try:
                print(numberVisited, "Visiting: ", url)
                parser = LinkParser()
                data, links = parser.getLinks(url)
                if data.find(word)>-1:
                    foundWord = True
                pagesToVisit = pagesToVisit + links
                print("**Success!**")
            except:
                print("**Failed!**")
        if foundWord:
            print("The word", word, "was found at", url)
        else:
            print("Word never found")
Citera
2015-11-08, 11:05
  #2
Medlem
key33s avatar
Du ser ju i ditt felmeddelande vad felet är:
Kod:
NameError: name 'spider' is not defined

Det är en klass du försöker använda och spider är en funktion i klassen LinkParser, du behöver först skapa en instans av klassen och sen anropa funktionen.

https://docs.python.org/3/tutorial/classes.html
Citera
2015-11-08, 11:31
  #3
Medlem
Alkyonioss avatar
Citat:
Ursprungligen postat av key33
Du ser ju i ditt felmeddelande vad felet är:
Kod:
NameError: name 'spider' is not defined

Det är en klass du försöker använda och spider är en funktion i klassen LinkParser, du behöver först skapa en instans av klassen och sen anropa funktionen.

https://docs.python.org/3/tutorial/classes.html

Kan jag göra det i IDLE?
Citera
2015-11-08, 12:25
  #4
Medlem
key33s avatar
Har inte möjlighet att köra koden så detta kanske inte blir helt rätt.

Du borde bara kunna lägga till koden i samma fil och köra koden, typ
Kod:
class LinkParser(HTMLParser):
  ..
  ..

c = LinkParser()
print(c.spider('http://www.google.se','google',1))
Citera
2015-11-08, 12:36
  #5
Medlem
Alkyonioss avatar
Citat:
Ursprungligen postat av key33
Har inte möjlighet att köra koden så detta kanske inte blir helt rätt.

Du borde bara kunna lägga till koden i samma fil och köra koden, typ
Kod:
class LinkParser(HTMLParser):
  ..
  ..

c = LinkParser()
print(c.spider('http://www.google.se','google',1))

Kod:
Traceback (most recent call last):
  File "C:/Users/x/Dropbox/Python/WebCrawler/source.py", line 54, in <module>
    print(c.spider('http://www.google.se', 'google', 1))
TypeError: spider() takes 3 positional arguments but 4 were given

Process finished with exit code 1

Detta felmeddelandet genereras nu. Hur i helvete får den det till 4 argument?
Citera
2015-11-08, 12:39
  #6
Medlem
key33s avatar
Citat:
Ursprungligen postat av Alkyonios
Kod:
Traceback (most recent call last):
  File "C:/Users/x/Dropbox/Python/WebCrawler/source.py", line 54, in <module>
    print(c.spider('http://www.google.se', 'google', 1))
TypeError: spider() takes 3 positional arguments but 4 were given

Process finished with exit code 1

Detta felmeddelandet genereras nu. Hur i helvete får den det till 4 argument?

Testa lägga till self som argument i spider funktionen?
Kod:
def spider(self, url, word, maxPages):
Citera
2015-11-08, 12:52
  #7
Medlem
Alkyonioss avatar
Citat:
Ursprungligen postat av key33
Testa lägga till self som argument i spider funktionen?
Kod:
def spider(self, url, word, maxPages):

Tack, nu funkar det


Edit: Däremot verkar det inte fungera för någon annan hemsida än den som skaparen testade med.

Testade att köra med aftonbladet och "start" som nyckelord och det hittade den inte trots att det står överst på första sidan
__________________
Senast redigerad av Alkyonios 2015-11-08 kl. 13:00.
Citera
2015-11-09, 13:14
  #8
Medlem
Citat:
Ursprungligen postat av Alkyonios
Tack, nu funkar det


Edit: Däremot verkar det inte fungera för någon annan hemsida än den som skaparen testade med.

Testade att köra med aftonbladet och "start" som nyckelord och det hittade den inte trots att det står överst på första sidan

Jag vet inte men
Har du definerat någon user agent? tänkte ifall de blockerar.
Citera
2015-11-09, 22:25
  #9
Medlem
Alkyonioss avatar
Citat:
Ursprungligen postat av greenhat
Jag vet inte men
Har du definerat någon user agent? tänkte ifall de blockerar.

Ingen aning om vad det är tyvärr
Citera
2015-11-10, 00:00
  #10
Medlem
https://en.wikipedia.org/wiki/User_agent

"The User-Agent string is one of the criteria by which Web crawlers may be excluded from accessing certain parts of a Web site using the Robots Exclusion Standard (robots.txt file)."

När du besöker en sida så rapporterar du vad du använder för webläsare tex Chrome version x

men default i urllib så säger du jag är ingen webläsare jag är ett pythonscript. och detta brukar större sidor blockera.
Så därför måste du lägga till i inställningarna att du är en webläsare.
Citera
2015-11-10, 21:00
  #11
Medlem
Alkyonioss avatar
Citat:
Ursprungligen postat av greenhat
https://en.wikipedia.org/wiki/User_agent

"The User-Agent string is one of the criteria by which Web crawlers may be excluded from accessing certain parts of a Web site using the Robots Exclusion Standard (robots.txt file)."

När du besöker en sida så rapporterar du vad du använder för webläsare tex Chrome version x

men default i urllib så säger du jag är ingen webläsare jag är ett pythonscript. och detta brukar större sidor blockera.
Så därför måste du lägga till i inställningarna att du är en webläsare.

Tack!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback