2016-05-16 2 views
2

Я пытаюсь написать паука, который рекурсивно царапает весь сайт, используя scrapy.Рекурсивный паук с scrapy только соскабливает первую страницу

Однако, хотя кажется, что он очищает первую страницу, он находит ссылки на этой странице, но не следит за ними и не царапает эти страницы, что мне нужно.

Я создал проект Scrapy и начал писать паук, который выглядит следующим образом:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.http import Request 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 
from urlparse import urljoin 

class EventsSpider(scrapy.Spider): 
    name = "events" 
    allowed_domains = ["www.foo.bar/"] 
    start_urls = (
     'http://www.foo.bar/events/', 
     ) 
    rules = (
     Rule(LinkExtractor(), callback="parse", follow= True), 
     ) 

    def parse(self, response): 
     yield { 
     'url':response.url, 
     'language':response.xpath('//meta[@name=\'Language\']/@content').extract(), 
     'description':response.xpath('//meta[@name=\'Description\']/@content').extract(), 
     } 
     for url in response.xpath('//a/@href').extract(): 
      if url and not url.startswith('#'): 
       self.logger.debug(urljoin(response.url, url)) 
       scrapy.http.Request(urljoin(response.url, url)) 

Затем при запуске паука с помощью scrapy crawl events -o events.json

я получаю выход в консоли:

2016-05-16 09:50:04 [scrapy] INFO: Spider closed (finished) 
PS C:\Projects\foo\src\Scrapy> scrapy crawl events -o .\events.json 
2016-05-16 09:54:36 [scrapy] INFO: Scrapy 1.1.0 started (bot: foo) 
2016-05-16 09:54:36 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'foo.spiders', 'FEED_URI': '.\\events.json 
', 'SPIDER_MODULES': ['foo.spiders'], 'BOT_NAME': 'foo', 'ROBOTSTXT_OBEY': True, 'FEED_FORMAT': 'json'} 
2016-05-16 09:54:36 [scrapy] INFO: Enabled extensions: 
['scrapy.extensions.feedexport.FeedExporter', 
'scrapy.extensions.logstats.LogStats', 
'scrapy.extensions.telnet.TelnetConsole', 
'scrapy.extensions.corestats.CoreStats'] 
2016-05-16 09:54:36 [scrapy] INFO: Enabled downloader middlewares: 
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 
'scrapy.downloadermiddlewares.retry.RetryMiddleware', 
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 
'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware', 
'scrapy.downloadermiddlewares.stats.DownloaderStats'] 
2016-05-16 09:54:36 [scrapy] INFO: Enabled spider middlewares: 
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 
'scrapy.spidermiddlewares.referer.RefererMiddleware', 
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 
'scrapy.spidermiddlewares.depth.DepthMiddleware'] 
2016-05-16 09:54:36 [scrapy] INFO: Enabled item pipelines: 
[] 
2016-05-16 09:54:36 [scrapy] INFO: Spider opened 
2016-05-16 09:54:36 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2016-05-16 09:54:36 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2016-05-16 09:54:36 [scrapy] DEBUG: Crawled (200) <GET http://www.foo.co.uk/robots.txt> (referer: None) 
2016-05-16 09:54:37 [scrapy] DEBUG: Crawled (200) <GET http://www.foo.co.uk/events/> (referer: None) 
2016-05-16 09:54:37 [scrapy] DEBUG: Scraped from <200 http://www.foo.co.uk/events/> 
{'description': [], 'language': [u'en_UK'], 'url': 'http://www.foo.co.uk/events/'} 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/default.aspx 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/page/a-z/ 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/thing/ 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/other-thing/ 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/foo-about-us/ 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/contactus 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/bar 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/event 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/super-cool-party 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/another-event 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/more-events 
2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/tps-report-convention 
... 

more links 

... 

2016-05-16 09:54:37 [events] DEBUG: http://www.foo.co.uk/events/tps-report-convention-two-the-return 
2016-05-16 09:54:37 [scrapy] INFO: Closing spider (finished) 
2016-05-16 09:54:37 [scrapy] INFO: Stored json feed (1 items) in: .\events.json 
2016-05-16 09:54:37 [scrapy] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 524, 
'downloader/request_count': 2, 
'downloader/request_method_count/GET': 2, 
'downloader/response_bytes': 6187, 
'downloader/response_count': 2, 
'downloader/response_status_count/200': 2, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2016, 5, 16, 8, 54, 37, 271000), 
'item_scraped_count': 1, 
'log_count/DEBUG': 80, 
'log_count/INFO': 8, 
'response_received_count': 2, 
'scheduler/dequeued': 1, 
'scheduler/dequeued/memory': 1, 
'scheduler/enqueued': 1, 
'scheduler/enqueued/memory': 1, 
'start_time': datetime.datetime(2016, 5, 16, 8, 54, 36, 913000)} 
2016-05-16 09:54:37 [scrapy] INFO: Spider closed (finished) 

А затем в файле events.json создаваемого ползать, единственная страница, которая, кажется, была зачищена URL начала указано в верхней части скрипта, когда мне действительно нужны все страницы, которые соответствуют/событиям /, чтобы быть скобками.

Я не уверен, как действовать дальше, поэтому любая помощь по этому вопросу будет очень признательна.

Спасибо.

+1

Для такого рода испытания, что лучше использовать scrapy.CrawlSpider –

ответ

1

Вы должны создать объект Item. Также используйте CrawlSpider, который вы импортировали. Я сделал несколько изменений в вашем коде, попытаюсь использовать его.

import scrapy 
from scrapy.http import Request 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 
from urlparse import urljoin 
#todo 
from your_project.items import YourItem 

class EventsSpider(CrawlSpider): 
    name = "events" 
    allowed_domains = ["foo.bar"] 
    start_urls = [ 
     'http://www.foo.bar/events/', 
    ] 
    rules = (
     Rule(LinkExtractor(), callback='parse_item', follow=True), 
    ) 

    def parse_item(self, response): 
     item = YourItem() 
     item['url'] = response.url 
     item['language'] = response.xpath('//meta[@name=\'Language\']/@content').extract() 
     item['description'] = response.xpath('//meta[@name=\'Description\']/@content').extract() 
     yield item 

     for url in response.xpath('//a/@href').extract(): 
      if url and not url.startswith('#'): 
       self.logger.debug(urljoin(response.url, url)) 
       scrapy.http.Request(urljoin(response.url, url)) 
+0

разрешённые домены должны быть 'allowed_domains = [«foo.bar»]' –

+0

спасибо, не стесняйтесь редактировать ответ. –

+0

Если я попробую это, я получаю '' 'Traceback (последний последний вызов): Файл« c: \ python27 \ lib \ site-packages \ twisted \ internet \ defer.py », строка 588, в _runCallbacks current.result = callback (current.result, * args, ** kw) Файл «c: \ python27 \ lib \ site-packages \ scrapy \ spiders \ __ init__.py», строка 76, in parse raise NotImplementedError NotImplementedError 2016- 05-16 10:44:00 [scrapy] INFO: Закрытие паука (закончено) '' 'Я предполагаю, что это потому, что scrapy ищет функцию синтаксического анализа, которую он не может найти, если он называется parse_item –

Смежные вопросы