2012-01-18 21 views
6

The script (bên dưới) từ this hướng dẫn chứa hai start_urls.Đoạn bắt đầu bóc lột

from scrapy.spider import Spider 
from scrapy.selector import Selector 

from dirbot.items import Website 

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

    def parse(self, response): 
     """ 
     The lines below is a spider contract. For more info see: 
     http://doc.scrapy.org/en/latest/topics/contracts.html 
     @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ 
     @scrapes name 
     """ 
     sel = Selector(response) 
     sites = sel.xpath('//ul[@class="directory-url"]/li') 
     items = [] 

     for site in sites: 
      item = Website() 
      item['name'] = site.xpath('a/text()').extract() 
      item['url'] = site.xpath('a/@href').extract() 
      item['description'] = site.xpath('text()').re('-\s[^\n]*\\r') 
      items.append(item) 

     return items 

Nhưng tại sao nó chỉ xóa 2 trang web này? Tôi thấy allowed_domains = ["dmoz.org"] nhưng hai trang này cũng chứa các liên kết đến các trang khác nằm trong phạm vi dmoz.org tên miền! Tại sao nó không cạo chúng?

Trả lời

2

Lớp học không có thuộc tính rules. Hãy xem http://readthedocs.org/docs/scrapy/en/latest/intro/overview.html và tìm kiếm "quy tắc" để tìm ví dụ.

+0

http://doc.scrapy.org/en/latest/topics/spiders.html nhưng quy tắc dành cho CrawlSpiders! tôi kế thừa từ BaseSpider! – DrStrangeLove

+0

BaseSpider chỉ đi đến các URL bắt đầu được cung cấp, vì vậy tôi đoán câu trả lời ban đầu của tôi là một chút sai lầm. Xem http://doc.scrapy.org/en/latest/topics/spiders.html#basespider – Glenn

+0

nhưng nó nói về start_urls: Các URL tiếp theo sẽ được tạo liên tiếp từ dữ liệu chứa trong URL bắt đầu. Tại sao nó không cạo những url tiếp theo? (tất nhiên, nếu những url đó nằm trong miền dmoz.org) – DrStrangeLove

2

Nếu bạn sử dụng BaseSpider, bên trong gọi lại, bạn phải tự mình trích xuất các url mong muốn và trả về đối tượng Request.

Nếu bạn sử dụng CrawlSpider, việc trích xuất liên kết sẽ được xử lý theo các quy tắc và SgmlLinkExtractor được liên kết với các quy tắc.

15

start_urls thuộc tính lớp chứa url bắt đầu - không có gì khác. Nếu bạn đã chiết xuất các url của các trang khác mà bạn muốn cạo - năng suất từ ​​parse gọi lại yêu cầu tương ứng với [khác] callback:

class Spider(BaseSpider): 

    name = 'my_spider' 
    start_urls = [ 
       'http://www.domain.com/' 
    ] 
    allowed_domains = ['domain.com'] 

    def parse(self, response): 
     '''Parse main page and extract categories links.''' 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select("//*[@id='tSubmenuContent']/a[position()>1]/@href").extract() 
     for url in urls: 
      url = urlparse.urljoin(response.url, url) 
      self.log('Found category url: %s' % url) 
      yield Request(url, callback = self.parseCategory) 

    def parseCategory(self, response): 
     '''Parse category page and extract links of the items.''' 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select("//*[@id='_list']//td[@class='tListDesc']/a/@href").extract() 
     for link in links: 
      itemLink = urlparse.urljoin(response.url, link) 
      self.log('Found item link: %s' % itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

    def parseItem(self, response): 
     ... 

Nếu bạn vẫn muốn tùy chỉnh bắt đầu yêu cầu sáng tạo, ghi đè phương pháp BaseSpider.start_requests()

6

start_urls chứa các liên kết mà từ đó con nhện bắt đầu thu thập dữ liệu. Nếu bạn muốn thu thập thông tin đệ quy, bạn nên sử dụng trình thu thập dữ liệu và xác định quy tắc cho điều đó. http://doc.scrapy.org/en/latest/topics/spiders.html xem ở đó chẳng hạn.

1

Nếu bạn sử dụng quy tắc để theo dõi các liên kết (đã được triển khai trong phần mềm), thì con nhện cũng sẽ xóa chúng. Tôi hy vọng đã giúp ...

from scrapy.contrib.spiders import BaseSpider, Rule 
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
    from scrapy.selector import HtmlXPathSelector 


    class Spider(BaseSpider): 
     name = 'my_spider' 
     start_urls = ['http://www.domain.com/'] 
     allowed_domains = ['domain.com'] 
     rules = [Rule(SgmlLinkExtractor(allow=[], deny[]), follow=True)] 

    ... 
0

bạn không viết hàm để xử lý các url bạn muốn nhận. Cũng có hai cách để reslolve.1.use quy tắc (crawlspider) 2: viết để xử lý các url mới và đặt chúng vào hàm gọi lại.

Các vấn đề liên quan