Этот ответ охватывает только способы вызова обратных вызовов с дополнительными аргументами и не решает проблему с динамическими формами для вашего конкретного сайта.
Для передачи дополнительных параметров обратному вызову вы можете использовать functools.partial
из стандартной библиотеки Python.
Упрощенный пример без Scrapy:
import functools
def func(self, response):
print self, response
def func_with_param(self, response, param):
print self, response, param
def caller(callback):
callback('self', 'response')
caller(func)
caller(functools.partial(func_with_param, param='param'))
Таким образом, вы должны определить make
и model
функции, подобные этой (self
всегда первый аргумент):
def make (self, response, years):
...
def model (self, response, years, makes):
...
И параметр обратного вызова:
import functools
...
def parse(self, response):
...
return FormRequest(url="http://www.gasbuddy.com/Trip_Calculator.aspx",
formdata={'Year': '%s'%("2011")},
callback=functools.partial(self.make, years='2011'))
Другой вариант передачи аргументов для обратного вызова в Scrapy - использовать meta
аргумент для FormRequest
Например:
def parse(self, response):
...
return FormRequest(url="http://www.gasbuddy.com/Trip_Calculator.aspx",
formdata={'Year': '%s'%("2011")},
meta={'years':'2011'},
callback=self.make)
def make (self, response):
years = response.meta['years']
...
И похоже на models
.
Еще одна проблема в вашем коде, FormRequest
только создаются и не используются.Вы должны вернуть их (как в моем parse
примере) или yield
их в цикле for:
for something in hxs.select(...).extract():
yield FormRequest(...)