我正在努力工作。我想为每个请求生成一个唯一的用户代理。我有以下几点:
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)
getAgent()
是一个实例方法,希望将ContactSpider
实例视为一个参数。但是,问题是,您不需要此函数成为您的Spider类的成员-将其移至单独的“ helpers” /“ 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)
另请参见:类和实例方法之间的区别。
或者,作为一种替代方法,可以使用scrapy-fake-user-agent
Scrapy中间件来无缝且随机地轮换用户代理。用户代理字符串由fake-useragent
模块提供。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句