2016-09-10 10 views
2

私はscrapyで作業しています。私は、リクエストごとに一意のユーザエージェントを生成したいと考えています。私は、次のしている:TypeError:正確に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

てみ '「ユーザーエージェント」:self.getAgent()' – albert

+0

私は以前、それは私を与えることを試みた:「ユーザーエージェント」:self.getAgent()、 NameError:名「自己」が – user61629

+0

に定義されていません'getAgent(None)'または 'def getAgent()'を使うか、自分自身を除いてクラス外にそのdefを移動してください – YOU

答えて

2

getAgent()インスタンスでありますメソッドと、引数としてContactSpiderインスタンスが表示されます。しかし、問題は、あなたのクモのクラスのメンバであることを、この機能を必要としない - 別の「ヘルパー」/「utilsの」/「LIBS」モジュールとインポートに移動:

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ミドルウェアがあります。ユーザーエージェント文字列はfake-useragent moduleによって提供されます。

+0

ありがとう、それは非常に役に立ちます。私はPythonのクラスとインスタンスメソッドのいくつかの参考文献を読んだが、def getAgent(self)を定義するとContactSpiderのインスタンスを渡さないので、私はまだ混乱しているのですか? – user61629

+0

@ user61629問題はありませんが、 'getAgent'を' def getAgent(self) 'として定義した場合、' getAgent'は 'ContactSpider'クラスのインスタンスで呼び出されますが、' getAgent() ' 。いずれにしても、メソッド内でクラスインスタンスを参照したり必要としない場合は、メソッドを静的にすることができるか、関数をクラス外に移動する必要があることを示します。ひどいことを明確に説明する:) – alecxe

+0

getAgent()は単独であり、クラスを必要としないことは間違いありません。実際にクラスに移動する前にスタンドアロン関数として持っていました。ありがとう、私はこれについて読んでいきます! – user61629

関連する問題