2016-09-10 8 views
2

Я работаю со скрипом. Я хочу создать уникальный пользовательский агент для каждого запроса. У меня есть следующий:ТипError: принимает ровно 1 аргумент (0 задан) - Scrapy

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 генерирует агент из списка формы:

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

Однако, когда я запускаю это я получаю:

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

Я пробовал раньше, но это дает мне: 'агент пользователя': self.getAgent(), NameError: имя 'я' не определен – user61629

+0

'getAgent (None)' или использовать 'def getAgent()', или переместить этот класс вне класса без self – YOU

ответ

2

getAgent() является экземпляром метод и ожидает увидеть пример ContactSpider в качестве аргумента. Но, проблема в том, что вам не нужно эту функцию, чтобы быть членом вашего класса паука - переместить его в отдельный «помощников»/«Utils» и модуль импорта/«ЛИЭС»:

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) 

См также: Difference between Class and Instance methods.


Или, в качестве альтернативного подхода, существует scrapy-fake-user-agent Scrapy промежуточного слоя, который будет вращать ПАгент легко и случайным образом. Строки User Agent предоставляются fake-useragent module.

+0

Спасибо, это очень полезно. Я прочитал хотя некоторые ссылки на методы класса и экземпляра в python, но я все еще запутался, потому что, когда я определяю def getAgent (self), я не передаю ему экземпляр ContactSpider? – user61629

+0

@ user61629 без проблем, когда вы определяете 'getAgent' как' def getAgent (self) 'вы ожидаете, что' getAgent' вызывается в экземпляре вашего класса 'ContactSpider', но вы вызываете его через' getAgent() ' , В любом случае, если вы не ссылаетесь или не нуждаетесь в экземпляре класса внутри метода - это указание на то, что вы либо можете сделать метод статическим, либо перенести функцию из класса. ужасно при объяснении вещей ясно :) – alecxe

+0

Его определенно верно, что getAgent() стоит один и не требует класса. На самом деле я использовал его как отдельную функцию, прежде чем перемещать ее в класс. Спасибо, я буду читать об этом! – user61629

Смежные вопросы