2010-03-16 25 views
24

Tôi muốn scrapy thu thập trang nơi xảy ra vào liên kết tiếp theo sẽ như thế này:Làm cách nào để sử dụng CrawlSpider từ dơ bẩn để nhấp vào liên kết có javascript trênclick?

<a href="#" onclick="return gotoPage('2');"> Next </a> 

sẽ scrapy có thể giải thích mã javascript về điều đó?

Với LiveHTTPHeaders phần mở rộng tôi phát hiện ra rằng kích Next tạo ra một POST với một mảnh thực sự khổng lồ của "rác" bắt đầu như thế này:

encoded_session_hidden_map=H4sIAAAAAAAAALWZXWwj1RXHJ9n 

Tôi cố gắng để xây dựng nhện của tôi trên lớp CrawlSpider, nhưng tôi thực sự không thể tìm ra cách để mã hóa nó, với BaseSpider tôi đã sử dụng phương pháp parse() để xử lý URL đầu tiên, mà sẽ xảy ra là một hình thức đăng nhập, nơi tôi đã làm một POST với:

def logon(self, response): 
    login_form_data={ 'email': '[email protected]', 'password': 'mypass22', 'action': 'sign-in' } 
    return [FormRequest.from_response(response, formnumber=0, formdata=login_form_data, callback=self.submit_next)] 

Và sau đó tôi đã xác định submit_next() để biết phải làm gì tiếp theo. Tôi không thể tìm ra cách để cho CrawlSpider biết phương pháp nào sử dụng trên URL đầu tiên?

Tất cả yêu cầu trong thu thập thông tin của tôi, ngoại trừ yêu cầu đầu tiên, là yêu cầu POST. Họ đang xen kẽ hai loại yêu cầu: dán một số dữ liệu và nhấp vào "Tiếp theo" để chuyển đến trang tiếp theo.

+1

Cho tôi thêm một số ngữ cảnh, không thể giải thích javascript nhưng bạn có thể bắt chước thông báo POST mà javascript gửi nếu bạn có thể tìm thấy (encoded_session_hidden_map) dưới dạng một số trường biểu mẫu ẩn hay gì đó. – Joshkunz

+0

Thử dùng PhantomJS .. –

Trả lời

3

Phương pháp thực tế sẽ như sau:

  1. bài viết yêu cầu của bạn để đạt được trang (như bạn đang làm)
  2. Extract liên kết đến trang tiếp theo từ đó phản ứng cụ thể
  3. đơn giản Yêu cầu trang tiếp theo nếu có thể hoặc sử dụng lại FormRequest trong áp dụng

Tất cả điều này phải được sắp xếp hợp lý với cơ chế phản hồi của máy chủ, ví dụ:

  • Bạn có thể thử sử dụng dont_click = true trong FormRequest.from_response
  • Hoặc bạn có thể muốn để xử lý các chuyển hướng (302) đến từ các máy chủ (trong trường hợp này bạn sẽ phải đề cập đến trong meta mà bạn đòi hỏi yêu cầu xử lý chuyển hướng cũng được gửi đến callback)

Bây giờ làm thế nào để tìm nó tất cả ra:. sử dụng một trình gỡ lỗi web như cáy hoặc bạn có thể sử dụng Firefox Plugin Firebug, hoặc chỉ cần nhấn F12 trong IE 9; và kiểm tra các yêu cầu mà người dùng thực sự thực hiện trên trang web phù hợp với cách bạn đang thu thập dữ liệu trang web.

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