2016-02-26 2 views
0

Я использую https://github.com/rolando/scrapy-redis, чтобы создать паук, который читает URL-адреса из списка Redis. Проблема заключается в том, что я хочу отправить уникальный идентификатор по каждой стороне URL. Чтобы я мог снова идентифицировать запись в db.Scrapy send variable вместе с URL-адресом для spider

Мой список в Redis выглядит следующим образом: http://google.com[someuniqueid] http://example.com[anotheruniqueid]

Scrapy-Redis по умолчанию читает лишь URL из Redis, который затем отправляется на паука.

Я модифицировал внутри: https://github.com/rolando/scrapy-redis/blob/master/scrapy_redis/spiders.py

И изменил эту функцию:

def next_request(self): 
    """Returns a request to be scheduled or none.""" 
    url = self.server.lpop(self.redis_key) 
    if url: 
     mm = url.split("[") 
     self.guid = mm[1].replace("]", "") 
     return self.make_requests_from_url(mm[0]) 

Это работает, я могу получить Guid внутри моего паука по телефону:

print self.guid 

Проблема, однако, что он, кажется, смешивает руководство. У меня всегда нет правильного указателя для каждого URL-адреса.

Как отправить направляющую моему паук?

+0

Вероятно, вы определено Guid в качестве общей переменной (за пределами от init, над ним). Поскольку async и только один способ сохранить значение. Просто догадаться – PascalVKooten

+0

Где я должен это положить? :) – mjhd

ответ

1

Это происходит потому, что scrapy является асинхронным, и вы храните асинхронные данные в переменной объекта, чтобы не полагаться на нее. Есть несколько способов приблизиться к этому. Наиболее распространенными являются:

использование scrapy.Request with meta={'guid': guid} аргумент.
заменить эту строку:

return self.make_requests_from_url(mm[0]) 

с:

return scrapy.Request(mm[0], meta={'guid': mm[1].replace("]", "")} 

и теперь в вашем parse() вы можете получить доступ к Guid с:

def parse(self, response): 
    guid = response.meta['guid']