2016-11-28 5 views
1

У меня очень мало опыта программирования с python больше с Java.Scrapy Python - Как пропустить URL-адрес и получить URL-адрес для скрепок

Я пытаюсь войти в python и проблемы с пониманием сканирующего веб-искателя, который я пытаюсь настроить.

Сценарий скрежет продукты и т. Д. С сайта и помещает их в файл и рекурсивно проходит через все десантные домены внутри сайта, но останавливается на заданной глубине.

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

код, который выполняет свой паук:

Scrappy Код здесь --------------------------------

process = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

process.crawl(UrlScrappyRunner, domain="www.google.com") 
process.start() 

мой паук:

class UrlScrappyRunner(scrapy.Spider): 

     name = "quotes" 

     def start_requests(self): 
      urls = [ 
       'http://quotes.toscrape.com/page/1/', 
       'http://quotes.toscrape.com/page/2/', 
      ] 
      for url in urls: 
       yield scrapy.Request(url=url, callback=self.parse) 

     def parse(self, response): 
      page = response.url.split("/")[-2] 
      filename = 'quotes-%s.html' % page 
      with open(filename, 'wb') as f: 
       f.write(response.body) 
      self.log('Saved file %s' % filename) 

Пожалуйста, вы можете, дайте мне знать, как передать домен = www.google.com на мой паук так ползает Google, а не quotes.toscrape.com?

ответ

1

Вы можете использовать argumets -a в Scrapy передать пользовательские значения

class UrlScrappyRunner(scrapy.Spider): 
      name = "quotes" 

      def __init__(self, domain=None, *args, **kwargs): 
       self.domain = domain 

      def start_requests(self): 
       urls = self.domain 

работать с аргументом

scrapy crawl UrlScrappyRunner -a domain="www.google.com" 

бежать от процесса:

process.crawl(UrlScrappyRunner, domain="www.google.com") 

добавить __init__ в ваш код и назначьте значение домена в переменной класса

+1

спасибо за это. Но проблема в том, что я запускаю его в сценарии, а не в командной строке, поэтому с помощью этого process.crawl (UrlScrappyRunner, domain = "www.google.com") – Sam

+0

@Raj, все одинаково. взгляните на обновленный ответ. вы можете пройти, как этот process.crawl (UrlScrappyRunner, domain = "www.google.com") – Backtrack

+0

@Raj. Одно дело, что вы должны это сделать, __init__ ничего, кроме конструктора. В котором вы должны получить аргументы и назначить свои переменные – Backtrack

0

Это как передать URLs в качестве аргументов в CrawlerProcess паук на Scrapy 1.4.0:

main.py

from scrapy.crawler import CrawlerProcess 
from myspider import MySpider 

if __name__ == '__main__': 
    process = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
    'FEED_URI': destination_file_uri # URI to destination file 
    }) 
    process.crawl(MySpider, myurls=[ 
    'http://example.com' 
    ]) 

Где destination_file_uri что-то вроде «файла: /// путь /to/results.json».

myspider.py

import scrapy 
from scrapy.http.request import Request 

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

    def __init__(self, *args, **kwargs): 
     self.myurls = kwargs.get('myurls', []) 
     super(MySpider, self).__init__(*args, **kwargs) 

    def start_requests(self): 
     for url in self.myurls: 
      yield Request(url, self.parse) 

    def parse(self, response): 
     """ Test: extract quotes """ 
     for quote in response.xpath('//blockquote').extract(): 
      yield {"quote": quote} 

Где myurls это уже не используется имя свойства (вы можете изменить его).