2014-09-22 7 views
6

Buduję projekt scrapy, w którym mam wiele pająków (pająk dla każdej domeny). Teraz adresy URL, które mają być pobierane, pochodzą dynamicznie od podanego przez użytkownika zapytania. więc zasadniczo nie muszę wykonywać szerokich indeksowań ani nawet śledzić linków. pojawią się adresy URL jeden po drugim i po prostu muszę wyodrębnić za pomocą selektorów. Zastanawiałem się, czy mógłbym po prostu przekazać adresy URL do kolejki wiadomości, z której mógłby czerpać pająk do scrapy, byłbym w porządku. Ale nie jestem w stanie tego rozgryźć. SprawdziłemJak zrobić start_url w scrapy do pobrania z kolejki wiadomości?

https://github.com/darkrho/scrapy-redis

ale czuję, to nie nadaje się do moich celów jak trzeba wielu kolejek (pojedyncza kolejka do każdego pająka). Jak się dowiedziałem, jednym ze sposobów wydaje się być zastąpienie metody start_request w pająku. Ale tutaj znowu nie jestem pewien, co robić (nowość w python i scrapy). Czy mogę po prostu traktować to jako normalny skrypt Pythona i ovverride metody używać (dowolnej) kolejki komunikatów? Potrzebuję również pająka (ów) pracującego 24 * 7 i skrobię, gdy istnieje żądanie w kolejce. Pomyślałem, że powinienem użyć sygnałów i podnieść gdzieś wyjątek DontCloseSpider. ale gdzie mam to zrobić? Jestem całkiem zagubiony. Proszę pomóż.

Oto scenariusz patrzę:

user-> Query -> URL z abc.com -> abc-pająk

  -> url from xyz.com -> xyz-spider 

      -> url from ghi.com -> ghi-spider 

Teraz każdy URL ma to samo do zgarniania za każda strona internetowa. Więc mam selektory robiące to w każdym pająku. Potrzebuję tylko scenariusza dla jednego użytkownika. kiedy jest wielu użytkowników, pojawi się wiele niepowiązanych adresów URL dla tego samego pająka. więc to będzie coś takiego:

QUERY1, QUERY2, query3

abc.com -> url_abc1, url_abc2, url_abc3

xyz.com -> url_xyz1, url_xyz2, url_xyz3

ghi .com -> url_ghi1, url_ghi2, ​​url_ghi3

, więc dla każdej witryny te adresy będą pojawiać się dynamicznie, które będą przekazywane do odpowiednich kolejek wiadomości. teraz każdy z pająków przeznaczonych do witryny musi zużyć odpowiednią kolejkę i przekazać mi skradzione przedmioty, gdy istnieje żądanie w kolejce wiadomości

+0

Problem polega na uruchomieniu wielu pająków? – Nabin

+1

nie. Problem polega na tym, jak sprawić, aby pająki (lub pająki) zostały pobrane z kolejki komunikatów. – Avinragh

+0

spójrz na http://stackoverflow.com/questions/21694386/running-more-than-one-spiders-one-by-one – Nabin

Odpowiedz

4

Jest to bardzo popularny i (IMO) doskonały sposób na zbudowanie scrapy jako części pipeline danych; Ciągle to robię.

Masz rację, że chcesz zastąpić metodę pająka start_requests(). Nie wiem, jak zachowuje się scrapy, jeśli zdefiniowano zmienną start_requests(), a także zmienną start_urls, ale polecam tylko użycie funkcji start_requests(), jeśli korzystasz z dynamicznego źródła, takiego jak baza danych.

Przykładowy kod, nietestowany, ale powinien dać ci odpowiedni pomysł. Proszę dać mi znać, jeśli potrzebujesz więcej informacji. Zakłada także, że kolejka jest zapełniana przez inny proces.

class ProfileSpider(scrapy.Spider): 
    name = 'myspider' 

    def start_requests(self): 
     while(True): 
      yield self.make_requests_from_url(
       self._pop_queue() 
      ) 

    def _pop_queue(self): 
     while(True): 
      yield self.queue.read() 

Ujawnia to twoją kolejkę jako generator. Jeśli chcesz zminimalizować ilość pustych pętli (ponieważ kolejka może być pusta przez dłuższy czas), możesz dodać polecenie sleep lub wykładniczy backoff w pętli _pop_queue. (Jeśli kolejka jest pusta, uśpij kilka sekund i spróbuj ponownie wystrzelić.)

Zakładając, że w twoim kodzie nie występują błędy krytyczne, uważam, że nie powinno to kończyć się z powodu budowy pętli/generatorów.

+0

Dziękuję! Mam problem z pracą pająka z kolejką wiadomości – Avinragh

+0

. Narzeka, że ​​błąd otrzymywał żądanie uruchomienia, ponieważ spodziewa się, że adresy URL ciągów będą generowane –

Powiązane problemy