2012-06-20 26 views
5

Przeszukuję witrynę internetową (tylko dwa poziomy głębokości) i chcę pobrać informacje z witryn na obu poziomach. Problem, na który napotykam, polega na tym, że chcę wypełnić pola jednego przedmiotu informacjami z obu poziomów. Jak mam to zrobic?Scrapy CrawlSpider: jak uzyskać dostęp do elementu na różnych poziomach analizy składniowej

Myślałem, że mam listę elementów jako zmienną instancji, która będzie dostępna dla wszystkich wątków (ponieważ jest to ta sama instancja pająka), a parse_1 wypełni niektóre pola, a parse_2 będzie musiał sprawdzić, czy popraw klucz przed wypełnieniem odpowiedniej wartości. Ta metoda wydaje się być uciążliwa i nadal nie jestem pewien, jak ją uruchomić.

To, co myślę, to musi być lepszy sposób, może jakoś przekazać przedmiot do oddzwaniania. Nie wiem jak to zrobić za pomocą metody Request(). Pomysły?

Odpowiedz

8

Z dokumentacji scrapy:

w niektórych przypadkach może być zainteresowany w przekazywaniu argumentów tych funkcji zwrotnych, dzięki czemu można otrzymać argumenty później, w drugim zwrotnego. Możesz użyć atrybutu Request.meta do tego.

Oto przykład, w jaki sposób przekazać element za pomocą tego mechanizmu, aby wypełnić różnych pól z różnych stron:

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = Request("http://www.example.com/some_page.html", 
         callback=self.parse_page2) 
    request.meta['item'] = item 
    return request 

def parse_page2(self, response): 
    item = response.meta['item'] 
    item['other_url'] = response.url 
    return item 

Więc w zasadzie można zeskrobać pierwszą stronę i przechowywać wszystkie informacje w punkcie a następnie wysłać całość element z żądaniem dla tego adresu URL drugiego poziomu i wszystkie informacje w jednym elemencie.

+0

Zrobiłem to, umieszczając informacje w adresie URL. Ta metoda wydaje się być lepsza, szczególnie w przypadku produktów, które nie są dobrze kodowane w adresach URL. Dzięki! – Muhd

+1

Jeśli mam dwie strony - strona 2 i strona 3 - które również zawierają części informacji, jak mogę je wywoływać sekwencyjnie w dwóch różnych przypadkach scrapy.Requests? Mogę przekazać na wpół wypełniony przedmiot w "meta" obu, ale chcę się upewnić, że ostateczny "przedmiot" ma dane ze strony 1 + strona 2 + strona 3 - wszystkie razem – dowjones123