Czy powinienem utworzyć rurociąg do zapisywania plików za pomocą scrapy?

Muszę zapisać plik (.pdf) ale nie wiem jak to zrobić. Muszę oszczędzać .pliki PDF i przechowywać je w taki sposób, że są one zorganizowane w katalogach, podobnie jak są przechowywane na stronie Jestem skrobanie ich off.

Z tego, co mogę zebrać, muszę utworzyć potoki, ale z tego, co rozumiem, potoki zapisują "Items" I "items" to tylko podstawowe dane, takie jak ciągi/liczby. Czy zapisywanie plików jest właściwym wykorzystaniem potoków, czy powinienem zapisać plik w spider?

Author: Pawel Miech, 2011-08-19

3 answers

Tak i nie[1]. Jeśli pobierasz plik pdf, zostanie on zapisany w pamięci, ale jeśli pliki PDF nie są wystarczająco duże, aby wypełnić dostępną pamięć, więc jest ok.

Możesz zapisać plik pdf w spider callback:

def parse_listing(self, response):
    # ... extract pdf urls
    for url in pdf_urls:
        yield Request(url, callback=self.save_pdf)

def save_pdf(self, response):
    path = self.get_path(response.url)
    with open(path, "wb") as f:
        f.write(response.body)

Jeśli zdecydujesz się zrobić to w potoku:

# in the spider
def parse_pdf(self, response):
    i = MyItem()
    i['body'] = response.body
    i['url'] = response.url
    # you can add more metadata to the item
    return i

# in your pipeline
def process_item(self, item, spider):
    path = self.get_path(item['url'])
    with open(path, "wb") as f:
        f.write(item['body'])
    # remove body and add path as reference
    del item['body']
    item['path'] = path
    # let item be processed by other pipelines. ie. db store
    return item

[1] inną metodą może być Przechowywanie tylko adresów URL plików PDF i używanie innego procesu do pobierania dokumentów bez buforowania w pamięci. (np. wget)

 14
Author: Rolando Max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-24 00:50:09

Istnieje FilesPipeline, którego możesz użyć bezpośrednio, zakładając, że masz już adres URL pliku, link pokazuje, jak używać FilesPipeline :

Https://groups.google.com/forum/print/msg/scrapy-users/kzGHFjXywuY/O6PIhoT3thsJ

 6
Author: Deming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-07 22:50:34

To idealne narzędzie do pracy. Scrappy działa tak, że masz pająki, które przekształcają strony internetowe w ustrukturyzowane dane (Elementy). Potoki są postprocesorami, ale używają tej samej infrastruktury asynchronicznej, co pająki, więc idealnie nadaje się do pobierania plików multimedialnych.

W Twoim przypadku najpierw wyodrębniłbyś lokalizację plików PDF w spider, pobierał je w potoku i miał inny Potok do zapisywania elementów.

 3
Author: Seb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-20 22:25:18