2010-02-03 4 views
15

Есть ли у Python библиотеки для очистки экрана, которые предлагают поддержку JavaScript?Скребок экрана с Python

Я использую pycurl для простых запросов HTML и Ява HtmlUnit для более сложных запросов, требующих поддержку JavaScript.

В идеале я хотел бы иметь возможность делать все с Python, но я не сталкивался с библиотеками, которые позволили бы мне это сделать. Они существуют?

+4

Многие полезные ответы на подобные вопросы здесь: HTTP://stackoverflow.com/search?q=scraping+python – 3zzy

+1

Точный дубликат: http://stackoverflow.com/questions/2081586/web-scraping-with-python –

+0

Нет не точного дубликата. В этом упоминается JavaScript, который требует разных инструментов, чем при работе со статическим HTML. – hoju

ответ

12

Есть много вариантов, когда дело со статической HTML, которые охватывают другие ответы. Однако, если вам нужна поддержка JavaScript и вы хотите остаться в Python, я рекомендую использовать webkit для отображения веб-страницы (включая JavaScript), а затем изучить полученный HTML-код. Например:

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 - я пытаюсь использовать этот код для очистки веб-сайта, но не знаю, что делать с переменной javascript_html после его возврата. 'print javsascript_html' возвращает ошибку' UnicodeEncodeError: 'ascii' кодек не может кодировать символ u '\ u2026' в позиции 4200: порядковый номер не в диапазоне (128) '. пожалуйста помоги! :) – significance

+0

, что является ошибкой unicode – hoju

+0

Я пытаюсь использовать это с Python 3, но обработанный html не обрабатывает Javascript. Вот код: [link] (http://pastebin.com/vzX9p7jv) – karmapolice

-2

Я ничего не нашел для этого. Я использую комбинацию beautifulsoup и пользовательских процедур ...

0

Вы можете попробовать 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 не экранирует царапины. – bdd

11

Beautiful soup все еще, вероятно, лучший выбор.

Если вам нужна «поддержка JavaScript» для перехвата запросов Ajax, вы должны также использовать какой-то захват (например, YATT), чтобы отслеживать, каковы эти запросы, а затем имитировать/разбирать их.

Если вам нужна «поддержка JavaScript», чтобы узнать, что такое конечный результат страницы со статическим JavaScript, тогда мой первый выбор - попытаться выяснить, что делает JavaScript на case- (например, если JavaScript делает что-то на основе некоторого Xml, то просто просто проанализируйте Xml прямо)

Если вы действительно хотите «поддержку JavaScript» (так как вы хотите увидеть, что HTML-код после скриптов были запущены на странице), тогда я думаю, что вам, вероятно, понадобится создать экземпляр некоторого элемента управления браузером, а затем прочитать полученный html/dom обратно из элемента управления браузера после его полной загрузки и разобрать его обычно с красивым супом. Это было бы моим последним прибежищем.

+1

В то время как BeautifulSoup прекрасно работает с «статичной» HTML-разметкой, которая приходит «как есть» с сервера, она терпит неудачу с одностраничными веб-приложениями ajaxy, которые динамически генерируют их контент через Javascript и XMLHttpRequests. Он также потерпит неудачу на сайтах, которые полагаются на Javascript для поддержания состояния сеанса и навигации специально для предотвращения веб-очистки. – 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.

Здесь вы идете: http://scrapy.org/

3

Selenium может быть? Он позволяет автоматизировать фактический браузер (Firefox, IE, Safari) с помощью python (среди других языков). Он предназначен для тестирования веб-сайтов, но, похоже, он также может использоваться для очистки. (отказ от ответственности: никогда не использовал его сам)

1

Библиотека Webscraping обертывает PyQt4 WebView в простой и простой в использовании API.

Вот простой пример, чтобы загрузить веб-страницу, оказываемую WebKit и извлечь элемент заголовка, используя XPath (взятый из URL выше):

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') 
Смежные вопросы