2012-02-23 2 views
3

Я использую scrapy для сканирования всех веб-страниц под доменом.scrapy crawling всего 1 уровень веб-сайта

Я видел this вопрос. Но решения нет. Моя проблема кажется схожей. Мой вывод команды ползания выглядит следующим образом:

scrapy crawl sjsu2012-02-22 19:41:35-0800 [scrapy] INFO: Scrapy 0.14.1 started (bot: sjsucrawler) 
2012-02-22 19:41:35-0800 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, MemoryUsage, SpiderState 
2012-02-22 19:41:35-0800 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2012-02-22 19:41:35-0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2012-02-22 19:41:35-0800 [scrapy] DEBUG: Enabled item pipelines: 
2012-02-22 19:41:35-0800 [sjsu] INFO: Spider opened 
2012-02-22 19:41:35-0800 [sjsu] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2012-02-22 19:41:35-0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023 
2012-02-22 19:41:35-0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080 
2012-02-22 19:41:35-0800 [sjsu] DEBUG: Crawled (200) <GET http://cs.sjsu.edu/> (referer: None) 
2012-02-22 19:41:35-0800 [sjsu] INFO: Closing spider (finished) 
2012-02-22 19:41:35-0800 [sjsu] INFO: Dumping spider stats: 
    {'downloader/request_bytes': 198, 
    'downloader/request_count': 1, 
    'downloader/request_method_count/GET': 1, 
    'downloader/response_bytes': 11000, 
    'downloader/response_count': 1, 
    'downloader/response_status_count/200': 1, 
    'finish_reason': 'finished', 
    'finish_time': datetime.datetime(2012, 2, 23, 3, 41, 35, 788155), 
    'scheduler/memory_enqueued': 1, 
    'start_time': datetime.datetime(2012, 2, 23, 3, 41, 35, 379951)} 
2012-02-22 19:41:35-0800 [sjsu] INFO: Spider closed (finished) 
2012-02-22 19:41:35-0800 [scrapy] INFO: Dumping global stats: 
    {'memusage/max': 29663232, 'memusage/startup': 29663232} 

Проблема вот ползать находит ссылки с первой страницы, но не посетить их. Какое использование такого искателя.

EDIT:

Мой гусеничный код:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

class SjsuSpider(BaseSpider): 
    name = "sjsu" 
    allowed_domains = ["sjsu.edu"] 
    start_urls = [ 
     "http://cs.sjsu.edu/" 
    ] 

    def parse(self, response): 
     filename = "sjsupages" 
     open(filename, 'wb').write(response.body) 

Все мои другие настройки по умолчанию.

+0

Вы можете показать код 'Spider' и' Rules'? – reclosedev

+0

@reclosedev: добавлены подробности. – riship89

ответ

9

Я думаю, что лучший способ сделать это - использовать Crawlspider. Таким образом, вы должны изменить свой код на это ниже, чтобы быть в состоянии найти все ссылки с первой страницы и посетить их:

class SjsuSpider(CrawlSpider): 

    name = 'sjsu' 
    allowed_domains = ['sjsu.edu'] 
    start_urls = ['http://cs.sjsu.edu/'] 
    # allow=() is used to match all links 
    rules = [Rule(SgmlLinkExtractor(allow=()), callback='parse_item')] 

    def parse_item(self, response): 
     x = HtmlXPathSelector(response) 

     filename = "sjsupages" 
     # open a file to append binary data 
     open(filename, 'ab').write(response.body) 

Если вы хотите, чтобы сканировать все ссылки на веб-сайте (а не только те в первый уровень), вы должны добавить правило следовать всем ссылкам, так что вы должны изменить правила переменных для это один:

rules = [ 
    Rule(SgmlLinkExtractor(allow=()), follow=True), 
    Rule(SgmlLinkExtractor(allow=()), callback='parse_item') 
] 

Я изменил свой «синтаксический анализ» обратный вызов «parse_item» из-за это:

При написании правил пауза-паука избегайте использования разбора в качестве обратного вызова, так как CrawlSpider использует сам метод анализа для реализации своей логики. Поэтому, если вы переопределите метод анализа, сканер обхода больше не будет работать.

Для получения дополнительной информации вы можете увидеть это: http://doc.scrapy.org/en/0.14/topics/spiders.html#crawlspider

+0

, спасибо, его работа, но parse_item не вызван. – riship89

+0

попытаться изменить callback = 'parse_item' на callback = ('parse_item'), или изменить правила: rules = [ Правило (SgmlLinkExtractor (allow =()), follow = True, callback = ('parse_item ') ] –

+0

Кроме того, рекомендуется открыть файл перед объявлением искателя и просто вызвать только метод write в parse_item. Вы можете добавить это перед классом искателя: myfile = open (имя файла,' ab '). и внутри parse_item вы можете использовать это: myfile.write (response.body). После вызова записи вы можете использовать функцию флеша, чтобы заставить вашу программу очищать данные в файле: myfile.flush(). –

2

Если вы используете basepider, в методе parse/callback вам нужно извлечь нужные URL-адреса и вернуть Request объекты, если вы намерены посетить эти URL-адреса.

for url in hxs.select('//a/@href').extract(): 
      yield Request(url, callback=self.parse) 

, что parse делает это вернуть вам ответ и вы должны сказать, что вы хотите с ним делать. Это указано в docs.

Или, если вы хотите использовать CrawlSpider, тогда вы просто определяете правила для своего spider.

+1

Спасибо. Я вижу это в документах, но в учебнике ничего не говорится об этом, и я предположил, что он будет сканировать все веб-страницы по дереву в разрешенном домене. Я еще не тестировал. Но я обязательно дам вам знать. Еще раз спасибо. – riship89

+0

без проблем ..просто помогая – goh

0

Только в случае, если это полезно. Когда искатель не работает, как в этом случае, убедитесь, что вы удаляете следующий код из вашего файла-паука. Это связано с тем, что паук настроен на вызов этого метода по умолчанию, если он объявлен в файле.

def parse(self, response): 
    pass 
Смежные вопросы