2012-10-21 15 views
24

Napisałem robota jest wykonywana przy użyciu scrapy,
teraz chcę ją kontrolować przez webapp Django, to znaczy:Jak skonfigurować i uruchomić Scrapy pająka programowo (adresy i ustawienia)

  • Set 1 lub kilka start_urls
  • Set 1 lub kilka allowed_domains
  • Set settings wartości
  • Uruchom pająk
  • Zatrzymaj/wstrzymaj/wznów pająk
  • pobierz niektóre statystyki podczas działania
  • pobierz niektóre statystyki po ukończeniu pająka.

Na początku myślałem scrapyd powstał za to, ale po przeczytaniu doc, wydaje się, że jest to bardziej demon stanie zarządzać „pająki zapakowanych” aka "jaja scrapy; i że wszystkie ustawienia (start_urls, allowed_domains, settings) muszą wciąż być zakodowane na stałe w samym "jajku do scrapy"; więc nie wygląda na rozwiązanie mojego pytania, chyba że coś przeoczyłem.

Spojrzałem również na to pytanie: How to give URL to scrapy for crawling?; Ale najlepsza odpowiedź na wiele adresów URL jest kwalifikowana przez autora himeslf jako "brzydki hack", obejmujący niektóre podprocesy Pythona i skomplikowaną obsługę powłoki, więc nie sądzę, aby znaleźć rozwiązanie tutaj. Ponadto może działać dla start_urls, ale wydaje się, że nie zezwala na allowed_domains lub settings.

Potem rzuciłem okiem na scrapy webservices: Wydaje się być dobrym rozwiązaniem do pobierania statystyk. Jednak to wymaga jeszcze uruchomione pająka, a nie wskazówka zmienić settings

Istnieje kilka pytań na ten temat, żaden z nich nie wydaje się zadowalająca:

Wiem, że scrapy stosowane są w środowiskach produkcyjnych; a narzędzie takie jak "scrapyd" pokazuje, że istnieją pewne sposoby, aby poradzić sobie z tymi wymaganiami (nie wyobrażam sobie, że złomowanie jaj scrapaży dotyczy ręcznego!)

Bardzo dziękuję za pomoc.

+0

Scrapy są tworzone z poleceniem 'deploy'; może możesz sprawdzić [Django Dynamic Scraper] (https://github.com/holgerd77/django-dynamic-scraper), aby uzyskać wskazówki, jak zintegrować kontrolę pająków Scrapy w Django. –

+0

Czy obejrzałeś [narzędzie do scrapy] (http://doc.scrapy.org/en/latest/topics/commands.html) lub [projekt slybot] (https://github.com/scrapy/slybot) dla Inspiracja? – jah

+0

Moja odpowiedź http://stackoverflow.com/questions/9814827/creating-a-generic-scrapy-spider/13054768#13054768 może pomóc – djinn

Odpowiedz

0

myślę, że trzeba spojrzeć na ten

http://django-dynamic-scraper.readthedocs.org/en/latest/

to robi nieco podobny, co chcesz. Używa także selera do planowania zadań. Możesz zobaczyć kod, aby zobaczyć, co robi.Myślę, że to będzie łatwe, jeśli zmodyfikować swój kod, aby robić to, co chcesz

Posiada również dobre dokumenty dotyczące sposobu konfiguracji interfejsu z Django

9

Na początku myślałem scrapyd powstał za to, ale po przeczytaniu dokumentu wydaje się, że jest to bardziej demon, który może zarządzać "zapakowanymi pająkami", czyli "jajami scrapy"; i że wszystkie ustawienia (start_urls, allowed_domains, settings) muszą być ciągle zakodowane w samym "jaju scrapy"; więc nie wygląda na rozwiązanie mojego pytania, chyba że coś przeoczyłem.

Nie zgadzam się z powyższym stwierdzeniem, start_urls nie muszą być zakodowane mogą być dynamicznie przeszedł do klasy, powinieneś być w stanie przekazać ją jako argument jak ten

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1 

Lub powinieneś być w stanie pobrać adresy URL z bazy danych lub pliku. Dostaję go z takiej bazy danych:

class WikipediaSpider(BaseSpider): 
    name = 'wikipedia' 
    allowed_domains = ['wikipedia.com'] 
    start_urls = [] 

    def __init__(self, name=None, url=None, **kwargs): 
     item = MovieItem() 
     item['spider'] = self.name 
     # You can pass a specific url to retrieve 
     if url: 
      if name is not None: 
       self.name = name 
      elif not getattr(self, 'name', None): 
       raise ValueError("%s must have a name" % type(self).__name__) 
      self.__dict__.update(kwargs) 
      self.start_urls = [url] 
     else: 
      # If there is no specific URL get it from Database 
      wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB --> 
      if wikiliks == None: 
       print "**************************************" 
       print "No Links to Query" 
       print "**************************************" 
       return None 

      for link in wikiliks: 
       # SOME PROCESSING ON THE LINK GOES HERE 
       self.start_urls.append(urllib.unquote_plus(link[0])) 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     # Remaining parse code goes here 
2

To jest naprawdę proste!

from mypackage.spiders import MySpider 
from scrapy.crawler import CrawlerProcess 

results = [] 

class MyPipeline(object): 
    """ A custom pipeline that stores scrape results in 'results'""" 
    def process_item(self, item, spider): 
     results.append(dict(item)) 

process = CrawlerProcess({ 
    # An example of a custom setting 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
    'ITEM_PIPELINES': {'__main__.MyPipeline': 1}, # Hooking in our custom pipline above 
}) 

start_urls=[ 
    'http://example.com/page1', 
    'http://example.com/page2', 
] 
process.crawl(MySpider, start_urls=start_urls) 
process.start() # the script will block here until the crawling is finished 

# Do something with the results 
print results 
+0

Czy jest również możliwe określenie dozwolonych_domeny w środowisku wykonawczym? –

6

Aby zmienić ustawienia programowo i działa skrobak z poziomu aplikacji, oto co mam: jajka

from scrapy.crawler import CrawlerProcess 
from myproject.spiders import MySpider 
from scrapy.utils.project import get_project_settings 

os.environ['SCRAPY_SETTINGS_MODULE'] = 'myproject.my_settings_module' 
scrapy_settings = get_project_settings() 
scrapy_settings.set('CUSTOM_PARAM', custom_vaule) 
scrapy_settings.set('ITEM_PIPELINES', {}) # don't write jsons or anything like that 
scrapy_settings.set('DOWNLOADER_MIDDLEWARES', { 
    'myproject.middlewares.SomeMiddleware': 100, 
}) 
process = CrawlerProcess(scrapy_settings) 
process.crawl(MySpider, start_urls=start_urls) 
process.start()