скраползание всего 1 уровня веб-сайта - PullRequest
3 голосов
/ 23 февраля 2012

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

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

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)

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

Ответы [ 3 ]

10 голосов
/ 28 февраля 2012

Я думаю, что лучший способ сделать это - использовать 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' на 'parse_item'из-за этого:

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

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

2 голосов
/ 23 февраля 2012

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

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

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

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

0 голосов
/ 01 февраля 2015

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

def parse(self, response):
  pass
...