2012-06-20 23 views
5

Tôi đang thu thập dữ liệu trang web (chỉ có hai cấp độ sâu) và tôi muốn xóa thông tin từ các trang web ở cả hai cấp. Vấn đề tôi đang gặp phải, là tôi muốn điền vào các lĩnh vực của một mục với thông tin từ cả hai cấp độ. Làm thế nào để tôi làm điều này? Tôi đã suy nghĩ có một danh sách các mục như là một biến thể hiện sẽ được truy cập bởi tất cả các chủ đề (vì nó là cùng một cá thể của con nhện), và phân tích cú pháp_1 sẽ điền vào một số trường, và phân tích cú pháp_2 sẽ phải kiểm tra khóa chính xác trước khi điền vào giá trị tương ứng. Phương pháp này có vẻ khó chịu, và tôi vẫn không chắc chắn làm thế nào để làm cho nó hoạt động.Scrapy CrawlSpider: cách truy cập mục qua các cấp phân tích khác nhau

Điều tôi đang nghĩ là phải có cách tốt hơn, có thể bằng cách nào đó chuyển một mục đến cuộc gọi lại. Tôi không biết làm thế nào để làm điều đó với phương thức Request(). Ý tưởng?

Trả lời

8

Từ tài liệu scrapy:

Trong một số trường hợp, bạn có thể quan tâm đến việc đi tranh luận với những chức năng gọi lại để bạn có thể nhận được những lập luận sau, trong khi gọi lại lần thứ hai. Bạn có thể sử dụng thuộc tính Request.meta cho điều đó.

Dưới đây là một ví dụ về làm thế nào để vượt qua một mục sử dụng cơ chế này, để cư các lĩnh vực khác nhau từ các trang khác nhau:

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = Request("http://www.example.com/some_page.html", 
         callback=self.parse_page2) 
    request.meta['item'] = item 
    return request 

def parse_page2(self, response): 
    item = response.meta['item'] 
    item['other_url'] = response.url 
    return item 

Vì vậy, về cơ bản bạn có thể cạo trang đầu tiên và lưu trữ tất cả thông tin trong mục và sau đó gửi toàn bộ mục có yêu cầu cho url cấp thứ hai đó và có tất cả thông tin trong một mục.

+0

Tôi đã từng làm điều này bằng cách dán thông tin vào URL. Bằng cách này có vẻ tốt hơn, đặc biệt là cho các mục không mã hóa tốt trong URL. Cảm ơn! – Muhd

+1

Nếu tôi có hai trang - trang 2 và trang 3 - có các phần của thông tin được điền đầy đủ, làm thế nào tôi có thể gọi chúng theo tuần tự trong hai scrapy.Requests khác nhau? Tôi có thể chuyển mục đã điền một nửa vào 'meta' cho cả hai, nhưng tôi muốn đảm bảo rằng 'mục' cuối cùng có dữ liệu từ trang 1 + trang 2 + trang 3 - tất cả cùng nhau – dowjones123

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