2012-01-10 39 views
12

Tôi đang sử dụng nhiều thứ để thu thập dữ liệu nhiều trang trên một trang web. Biến số start_urls được sử dụng để xác định các trang được thu thập thông tin. tôi ban đầu sẽ bắt đầu với trang 1, do đó việc xác định start_urls = [1st page] trong file example_spider.pystart_urls động trong scrapy

Sau khi nhận được thêm thông tin từ trang 1, tôi sẽ xác định những gì các trang tiếp theo để được thu thập, sau đó sẽ gán start_urls cho phù hợp. Do đó, tôi phải ghi đè lên trên example_spider.py với các thay đổi đối với start_urls = [1st page, 2nd page, ..., Kth page], sau đó chạy thu thập dữ liệu một lần nữa.

Đó có phải là cách tiếp cận tốt nhất hoặc có cách nào tốt hơn để gán động start_urls sử dụng API phế liệu mà không phải ghi đè example_splider.py không? Cảm ơn.

Trả lời

21

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, phương pháp ghi đè BaseSpider.start_requests()

+0

là parseItem (tự, trả lời) trả lại hàng? – friddle

+0

'parseItem' như bất kỳ cuộc gọi lại nào khác có thể trả về một' Mục' hoặc một 'Yêu cầu' khác bằng cách gọi lại – warvariuc

+0

cảm ơn bạn trả lời – friddle

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