2016-09-10 6 views
2

Ich arbeite mit scrapy. Ich möchte für jede Anfrage einen eindeutigen Benutzeragenten generieren. Ich habe folgendes:TypeError: nimmt genau 1 Argument (0 gegeben) - Scrapy

"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 

Allerdings, wenn ich dies laufe ich bekommen:

class ContactSpider(Spider): 
    name = "contact" 

    def getAgent(self): 
     f = open('useragentstrings.txt') 
     agents = f.readlines() 
     return random.choice(agents).strip() 

    headers = {   
     'user-agent': getAgent(), 
     'content-type': "application/x-www-form-urlencoded", 
     'cache-control': "no-cache" 
    } 

    def parse(self, response): 
     open_in_browser(response) 

getAgent einen Agenten aus einer Liste der Form erzeugt

File "..spiders\contact_spider.py, line 35, in <module> 
    class ContactSpider(Spider): 
    File "..spiders\contact_spider.py", line 54, in ContactSpider 
    'user-agent': getAgent(), 
TypeError: getAgent() takes exactly 1 argument (0 given) 
+0

Try ' 'user-agent': self.getAgent()' – albert

+0

ich, dass früher versucht, aber es gibt mir: 'User-Agent': self.getAgent(), Nameerror: name 'Selbst' ist – user61629

+0

nicht definiert 'getAgent (None)' oder benutze 'def getAgent()', oder verschiebe das def außerhalb der Klasse ohne self – YOU

Antwort

2

getAgent() ist eine Instanz Methode und erwartet, die ContactSpider Instanz als ein Argument zu sehen. Aber das Problem ist, müssen Sie diese Funktion nicht benötigen ein Mitglied Ihrer Spinne Klasse sein - verschieben Sie sie in einem separaten „Helfer“/„utils“/„Libs“ -Modul und Import:

from helpers import getAgent 

class ContactSpider(Spider): 
    name = "contact" 

    headers = {   
     'user-agent': getAgent(), 
     'content-type': "application/x-www-form-urlencoded", 
     'cache-control': "no-cache" 
    } 

    def parse(self, response): 
     open_in_browser(response) 

See auch: Difference between Class and Instance methods.


Oder als Alternative gibt es eine scrapy-fake-user-agent Scrapy Middleware, die Benutzerprogramme nahtlos und zufällig drehen würde. User Agent-Zeichenfolgen werden von fake-useragent module bereitgestellt.

+0

Danke, das ist sehr hilfreich. Ich lese zwar einige Referenzen zu Klassen- und Instanzmethoden in Python, aber ich bin immer noch verwirrt, denn wenn ich def getAgent (self) definiere, gebe ich keine Instanz von ContactSpider an ihn weiter? – user61629

+0

@ user61629 kein Problem, wenn Sie 'getAgent' als' def getAgent (self) 'definieren, erwarten Sie, dass' getAgent' für eine Instanz Ihrer 'ContactSpider' Klasse aufgerufen wird, aber Sie rufen sie nur über' getAgent() 'auf . In jedem Fall, wenn Sie die Klasseninstanz nicht innerhalb der Methode referenzieren oder nicht benötigen - dies ist ein Hinweis darauf, dass Sie entweder eine Methode statisch machen können oder die Funktion aus der Klasse entfernen sollten schrecklich, Dinge klar zu erklären :) – alecxe

+0

Es stimmt definitiv, dass getAgent() alleine steht und die Klasse nicht benötigt, tatsächlich hatte ich es als eigenständige Funktion, bevor ich es in die Klasse brachte. Danke, ich werde weiter darüber lesen! – user61629

Verwandte Themen