2012-04-15 2 views
0
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

class DmozSpider(BaseSpider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//ul/li') 
     for site in sites: 
      title = site.select('a/text()').extract() 
      link = site.select('a/@href').extract() 
      desc = site.select('text()').extract() 
      print title, link, desc 

Это мой код. Я хочу, чтобы много URL-адресов очищали с помощью цикла. Итак, как я могу это допустить? Я поместил несколько URL-адресов, но я не получил выход от всех них. Некоторые URL-адреса перестают отвечать. Итак, как я могу получить данные точно, используя этот код?сканирование нескольких веб-страниц с веб-сайта

ответ

0

Вы только что отправили код из tutorial. Что вы должны сделать, так это на самом деле читать всю документацию, особенно часть basic concept. То, что вы в основном хотите, это crawl spider, где вы можете определить правила, по которым паук будет следовать и обрабатывать ваш код.

Процитируем документы на примере:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 

class MySpider(CrawlSpider): 
    name = 'example.com' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com'] 

    rules = (
     # Extract links matching 'category.php' (but not matching 'subsection.php') 
     # and follow links from them (since no callback means follow=True by default). 
     Rule(SgmlLinkExtractor(allow=('category\.php',), deny=('subsection\.php',))), 

     # Extract links matching 'item.php' and parse them with the spider's method parse_item 
     Rule(SgmlLinkExtractor(allow=('item\.php',)), callback='parse_item'), 
    ) 

    def parse_item(self, response): 
     self.log('Hi, this is an item page! %s' % response.url) 

     hxs = HtmlXPathSelector(response) 
     item = Item() 
     item['id'] = hxs.select('//td[@id="item_id"]/text()').re(r'ID: (\d+)') 
     item['name'] = hxs.select('//td[@id="item_name"]/text()').extract() 
     item['description'] = hxs.select('//td[@id="item_description"]/text()').extract() 
     return item 
+0

Извините за поздний ответ, я попытался определить правила, но это не моя настоящая проблема. Моя проблема заключается в том, как получить вывод всех страниц, которые я поставляю в start_urls? Я получаю вывод в моем .csv-файле только с первых 3-4 страниц. У меня около около 20 страниц, чтобы царапать. Итак, как я должен это делать? После очистки этих 3-4 страниц моя программа перестает получать ответ с сервера. – Nits

1

Вы код выглядит нормально, но вы уверены, что start_urls не должен начинаться с http://

start_urls = [ 
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
] 

UPD

start_urls начинается список скрининга urls. Обычно он имеет одну или две ссылки. Редко больше. Эти страницы должны иметь идентичную структуру HTML, потому что Scrapy Spider обрабатывает их одинаково.

Посмотрите, если я поставил 4-5 URL в start_urls, он дает выход ok для первых 2-3 url's.

Я не верю в это, потому что scrapy не волнует, сколько ссылок - start_urls.

Но он перестает отвечать, а также расскажет, как я могу реализовать GUI для этого.?

Scrapy имеет debug shell, чтобы проверить ваш код.

+0

Хм, глядя на простоту ответа, я не совсем уверен, что правильно понял вопрос. Я думаю, что ваш ответ может быть более подходящим, чем мой, но я все равно оставляю его, так как я думаю, что OP также может искать сам процесс обхода. – DrColossos

+0

Я не против, но что такое 'OP'? =) – San4ez

+0

Это означает «Opriginal Poster»;) – DrColossos