2013-06-10 46 views
5

Tôi đang sử dụng Python và Scrapy cho câu hỏi này.Tôi làm cách nào để sử dụng Scrapy để thu thập thông tin trong các trang?

Tôi đang cố gắng thu thập trang web Một, trong đó có chứa một danh sách các liên kết đến các trang web B1, B2, B3, ... Mỗi B trang chứa một liên kết đến một trang khác, C1, C2, C3, ..., chứa hình ảnh.

Vì vậy, sử dụng Scrapy, ý tưởng trong pseudo-code là:

links = getlinks(A) 
for link in links: 
    B = getpage(link) 
    C = getpage(B) 
    image = getimage(C) 

Tuy nhiên, tôi đang chạy vào một vấn đề khi cố gắng phân tích nhiều hơn một trang trong Scrapy. Đây là mã của tôi:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('...') 

    items = [] 
    for link in links: 
     item = CustomItem() 
     item['name'] = link.select('...') 
     # TODO: Somehow I need to go two pages deep and extract an image. 
     item['image'] = .... 

Tôi sẽ làm gì?

(Lưu ý: Câu hỏi của tôi cũng tương tự như Using multiple spiders at in the project in Scrapy nhưng tôi không chắc chắn làm thế nào để "trở lại" giá trị từ đối tượng Request Scrapy của.)

Trả lời

6

Trong scrapy phương pháp phân tích cần phải trả lại một yêu cầu mới nếu bạn cần phải phát hành thêm yêu cầu (sử dụng yield làm việc cồng kềnh hoạt động tốt với máy phát điện). Bên trong yêu cầu này bạn có thể thiết lập một cuộc gọi lại đến chức năng mong muốn (để đệ quy chỉ cần vượt qua parse một lần nữa). Đó là cách để thu thập dữ liệu vào các trang.

Bạn có thể kiểm tra this recursive crawler làm ví dụ

Tiếp theo ví dụ của bạn, sự thay đổi sẽ là một cái gì đó như thế này:

def parse(self, response): 
    b_pages_links = getlinks(A) 
    for link in b_pages_links: 
     yield Request(link, callback = self.visit_b_page) 

def visit_b_page(self, response): 
    url_of_c_page = ... 
    yield Request(url_of_c_page, callback = self.visit_c_page) 

def visit_c_page(self, response): 
    url_of_image = ... 
    yield Request(url_of_image, callback = self.get_image) 

def get_image(self, response): 
    item = CustomItem() 
    item['name'] = ... # get image name 
    item['image'] = ... # get image data 
    yield item 

Ngoài ra kiểm tra scrapy documentationthese random code snippets. Họ có thể giúp đỡ rất nhiều :)

+0

Cảm ơn, điều này thật tuyệt vời. Nếu tôi muốn tạo 'CustomItem' trong phương thức' parse', tôi có thể truyền nó bằng cách sử dụng thuộc tính meta không? – sdasdadas

+0

Ngoài ra, tôi muốn trả về một danh sách các mục ('items = []'). Làm thế nào tôi sẽ sử dụng ở trên và sau đó, sau khi hoàn thành của nó, gắn thêm mục vào danh sách? – sdasdadas

+0

Chức năng chỉ có nhện là truy cập một trang, trích xuất và trả về dữ liệu (mục cuối cùng của mục lợi nhuận). Để tổng hợp dữ liệu, giống như đặt tất cả các mục trong một danh sách, bạn cần tạo một hàm trong mô-đun 'pipelines' (đây chỉ là một quy ước). [Đường dẫn ví dụ này] (https://github.com/bcap/wikipedia-music/blob/master/crawler/crawler/pipelines.py) tạo tệp chấm dựa trên tất cả các thể loại nhạc được thu thập thông tin –

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