2016-10-25 3 views
0

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

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from scrapy.selector import Selector 
from craigslist_sample.items import CraigslistSampleItem 

class MySpider(CrawlSpider): 
name = "craig" 
# allowed_domains = ["support.t-mobile.com/community/phones-tablets-devices/"] 
# start_urls = ["https://support.t-mobile.com/community/phones-tablets-devices/apple/content?start=20&filterID=contentstatus%5Bpublished%5D~objecttype~objecttype%5Bthread%5D"] 

allowed_domains = ["reddit.com/rising/"] 
start_urls = ["https://www.reddit.com/rising/"] 


rules = [ 
Rule(LinkExtractor(allow=()), follow=True), 
Rule(LinkExtractor(allow=()), callback='parse') 
] 

def parse(self, response): 
    hxs = Selector(response) 
    item = CraigslistSampleItem() 
    # item['link'] = hxs.xpath('//td[@class = "j-td-title"]/div/a/@href').extract() 
    # item['title'] = hxs.xpath('//td[@class = "j-td-title"]/div/a/text()').extract() 
    # item['content'] = hxs.xpath('//div[@class="jive-rendered-content"]/p/text()').extract() 
    item['URL'] = response.request.url 
    print item 

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

выход

консоль выглядит следующим образом:

2016-10-25 14:36:38 [scrapy] INFO: Scrapy 1.0.3 started (bot: 

craigslist_sample) 
2016-10-25 14:36:38 [scrapy] INFO: Optional features available: ssl, http11, boto 
2016-10-25 14:36:38 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'craigslist_sample.spiders', 'SPIDER_MODULES': ['craigslist_sample.spiders'], 'BOT_NAME': 'craigslist_sample'} 
2016-10-25 14:36:38 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState 
2016-10-25 14:36:38 [boto] DEBUG: Retrieving credentials from metadata server. 
2016-10-25 14:36:39 [boto] ERROR: Caught exception reading instance data 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/boto/utils.py", line 210, in retry_url 
    r = opener.open(req, timeout=timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 429, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.7/urllib2.py", line 447, in _open 
    '_open', req) 
    File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 1228, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.7/urllib2.py", line 1198, in do_open 
    raise URLError(err) 
URLError: <urlopen error timed out> 
2016-10-25 14:36:39 [boto] ERROR: Unable to read instance data, giving up 
2016-10-25 14:36:39 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2016-10-25 14:36:39 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2016-10-25 14:36:39 [scrapy] INFO: Enabled item pipelines: 
2016-10-25 14:36:39 [scrapy] INFO: Spider opened 
2016-10-25 14:36:39 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2016-10-25 14:36:39 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2016-10-25 14:36:40 [scrapy] DEBUG: Crawled (200) <GET https://www.reddit.com/rising/> (referer: None) 
2016-10-25 14:36:40 [scrapy] INFO: Closing spider (finished) 
2016-10-25 14:36:40 [scrapy] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 219, 
'downloader/request_count': 1, 
'downloader/request_method_count/GET': 1, 
'downloader/response_bytes': 24786, 
'downloader/response_count': 1, 
'downloader/response_status_count/200': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2016, 10, 25, 18, 36, 40, 242330), 
'log_count/DEBUG': 3, 
'log_count/ERROR': 2, 
'log_count/INFO': 7, 
'response_received_count': 1, 
'scheduler/dequeued': 1, 
'scheduler/dequeued/memory': 1, 
'scheduler/enqueued': 1, 
'scheduler/enqueued/memory': 1, 
'start_time': datetime.datetime(2016, 10, 25, 18, 36, 39, 525046)} 
2016-10-25 14:36:40 [scrapy] INFO: Spider closed (finished) 

ответ

0

я нашел три проблемы в вашем коде:

(1) allowed_domains. allowed-domain используется для фильтрации ссылок на сайты и сам должен быть действительным Domain Name. Пожалуйста, измените его на:

allowed_domains = ['reddit.com'] 

(2) parse callback. parse - ответ default callback ответа, когда их запрос не указывает обратный вызов. Пожалуйста, переименуйте его, например, как parse_item и переименуйте parse на parse_item. Пожалуйста, прочтите Warning:

Предупреждения

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

(3) О Rule. Я не понимаю твое правило. Пожалуйста, прочитайте правила Rule documents

Какой список из одного (или более) объектов Rule. Каждое правило определяет определенное поведение для обхода сайта. Объекты правил описаны ниже. Если несколько правил соответствуют одной и той же ссылке, первая будет использоваться в соответствии с порядком, определенным в этом атрибуте.

следовать

следующим является логическое значение, которое указывает, если ссылки должны следовать друг от ответа, извлеченной с этим правилом. Если обратный вызов равен None, по умолчанию используется значение True, в противном случае оно по умолчанию - False.

В коде:

rules = [ 
    # allow all links (in allowed_domains), and follow them, and not parse 
    Rule(LinkExtractor(allow=()), follow=True), 
    # allow all links (in allowed_domains), and not follow, and call parse to parse 
    Rule(LinkExtractor(allow=()), callback='parse') 
    ] 

самозабвенно, ваши правила конфликта, если вы хотите следовать все ссылки и разобрать их все, используйте следующий код:

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

Вот код, который работает для меня:

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


class RedditSpider(CrawlSpider): 
    name = "reddit" 
    allowed_domains = ["reddit.com"] 
    start_urls = ["https://www.reddit.com/rising/"] 

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

    def parse_item(self, response): 
     pass 

Надеюсь, мое объяснение полезно. Благодаря!

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