2010-02-03 43 views
15

Python có thư viện cạo màn hình cung cấp hỗ trợ JavaScript không?Cạo màn hình bằng Python

Tôi đã sử dụng pycurl cho các yêu cầu HTML đơn giản, và Java HtmlUnit cho các yêu cầu phức tạp hơn đòi hỏi hỗ trợ JavaScript.

Lý tưởng nhất là tôi muốn có thể làm mọi thứ từ Python, nhưng tôi chưa từng gặp bất kỳ thư viện nào cho phép tôi thực hiện. Họ có tồn tại không?

+4

Rất nhiều câu trả lời hữu ích về các vấn đề tương tự ở đây: http://stackoverflow.com/search?q=scraping+python – 3zzy

+1

Bản sao chính xác: http://stackoverflow.com/questions/2081586/web-scraping-with-python –

+0

không phải là bản sao chính xác. Điều này đề cập đến JavaScript, đòi hỏi các công cụ khác nhau hơn khi làm việc với HTML tĩnh. – hoju

Trả lời

12

Có nhiều lựa chọn khi giao dịch với HTML tĩnh, mà các câu trả lời khác che. Tuy nhiên nếu bạn cần hỗ trợ JavaScript và muốn ở lại bằng Python, tôi khuyên bạn nên sử dụng webkit để hiển thị trang web (bao gồm JavaScript) và sau đó kiểm tra HTML kết quả. Ví dụ:

import sys 
import signal 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import QWebPage 

class Render(QWebPage): 
    def __init__(self, url): 
     self.app = QApplication(sys.argv) 
     QWebPage.__init__(self) 
     self.html = None 
     signal.signal(signal.SIGINT, signal.SIG_DFL) 
     self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading) 
     self.mainFrame().load(QUrl(url)) 
     self.app.exec_() 

    def _finished_loading(self, result): 
     self.html = self.mainFrame().toHtml() 
     self.app.quit() 


if __name__ == '__main__': 
    try: 
     url = sys.argv[1] 
    except IndexError: 
     print 'Usage: %s url' % sys.argv[0] 
    else: 
     javascript_html = Render(url).html 
+0

Plumo - đang cố gắng sử dụng mã này để xóa một trang web nhưng tôi không chắc chắn nên làm gì với biến 'javascript_html' khi nó được trả lại. 'print javsascript_html' trả về lỗi 'UnicodeEncodeError:' ascii 'codec không thể mã hóa ký tự u' \ u2026 'ở vị trí 4200: thứ tự không nằm trong phạm vi (128)'. Hãy giúp tôi! :) – significance

+0

đó là lỗi unicode – hoju

+0

Tôi đang thử điều này với Python 3, nhưng html được hiển thị không có Javascript được xử lý. Đây là mã: [link] (http://pastebin.com/vzX9p7jv) – karmapolice

-2

Tôi không tìm thấy bất cứ điều gì cho việc này. Tôi sử dụng kết hợp các quy trình làm đẹp và thói quen tùy chỉnh ...

0

bạn có thể thử spidermonkey?

This Python module allows for the implementation of Javascript? classes, objects and functions in Python, as well as the evaluation and calling of Javascript scripts and functions. It borrows heavily from Claes Jacobssen's Javascript Perl module, which in turn is based on Mozilla's PerlConnect Perl binding.

+0

Spidermonkey không sàng lọc màn hình. – bdd

11

Beautiful soup vẫn có thể là lựa chọn tốt nhất của bạn.

Nếu bạn cần "hỗ trợ JavaScript" cho mục đích chặn các yêu cầu Ajax thì bạn nên sử dụng một số loại chụp (chẳng hạn như YATT) để theo dõi những yêu cầu đó là gì và sau đó mô phỏng/phân tích chúng.

Nếu bạn cần "hỗ trợ JavaScript" để có thể xem kết quả cuối cùng của trang có JavaScript tĩnh là gì, thì lựa chọn đầu tiên của tôi là thử và tìm hiểu JavaScript đang làm gì trong trường hợp- cơ sở từng trường hợp (ví dụ: nếu JavaScript đang thực hiện điều gì đó dựa trên một số Xml, thì chỉ cần phân tích cú pháp trực tiếp Xml)

Nếu bạn muốn xem html là gì sau tập lệnh đã được chạy trên một trang) sau đó tôi nghĩ rằng bạn có thể sẽ cần phải tạo một thể hiện của một số điều khiển trình duyệt, và sau đó đọc kết quả html/dom trở lại từ điều khiển trình duyệt khi tải xong và phân tích nó bình thường với súp đẹp. Đó sẽ là phương sách cuối cùng của tôi.

+1

Trong khi BeautifulSoup hoạt động đẹp mắt với đánh dấu HTML 'tĩnh' đến từ 'as-is' từ máy chủ, nó sẽ thất bại thảm hại với các ứng dụng web ajaxy kiểu trang đơn tạo nội dung của chúng theo cách động thông qua Javascript và XMLHttpRequests. Nó cũng sẽ thất bại trên các trang web dựa trên Javascript để duy trì trạng thái phiên và điều hướng cụ thể để ngăn chặn việc cào web. – ccpizza

4

Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing.

Ở đây bạn đi: http://scrapy.org/

3

Selenium có thể? Nó cho phép bạn tự động hóa một trình duyệt thực (Firefox, IE, Safari) bằng cách sử dụng python (trong số các ngôn ngữ khác). Nó có nghĩa là để thử nghiệm các trang web, nhưng có vẻ như nó có thể được sử dụng cho cạo là tốt. (tuyên bố từ chối trách nhiệm: không bao giờ sử dụng bản thân mình)

1

Thư viện Webscraping kết thúc tốt đẹp WebView PyQt4 thành API đơn giản và dễ sử dụng.

Đây là một ví dụ đơn giản để tải về một trang web rendered bởi WebKit và trích xuất các yếu tố tiêu đề sử dụng XPath (lấy từ URL ở trên):

from webscraping import download, xpath 
D = download.Download() 
# download and cache the Google Code webpage 
html = D.get('http://code.google.com/p/webscraping') 
# use xpath to extract the project title 
print xpath.get(html, '//div[@id="pname"]/a/span') 
Các vấn đề liên quan