當前位置:首頁 » 編程語言 » pythonwebkit

pythonwebkit

發布時間: 2022-08-09 09:01:43

1. python 用什麼模塊處理網頁的javascript

lxml 配合 html5lib
可以很好的解析 html DOM
但對於js的解析 據我所知現在沒有什麼很成熟的模塊能做這個

解析js肯定不是正則能辦得到的, 比較現實的方案是
從webkit下手, 但光這一個庫就有10+M
(利用webkit自己解析js等解析完之後讀取html dom, 什麼時候解析完,什麼內容需要解析,什麼內容不應該解析是使用的難點)

如果你碰到的js代碼比較簡單
可以自己看看js代碼然後使用python模擬js代碼得到網址

其中使用webkit是最難的(不是簡單顯示界面,需要自己hook)
模擬js其次
lxml是最普遍的了
(這個解析一般的html必須配合其他html解析庫,自帶的那個html解析不是很健壯碰到稍微差點的頁面就不能正確解析)
另外html DOM 裡面 beautifulsoup 是一個比較老道的使用正則實現解析HTML DOM的庫.

2. 如何用python爬取js動態生成內容的頁面

抓取js動態生成的內容的頁面有兩種基本的解決方案

1用dryscrape庫動態抓取頁面
js腳本是通過瀏覽器來執行並返回信息的,所以,抓取js執行後的頁面,一個最直接的方式就是用python模擬瀏覽器的行為。WebKit 是一個開源的瀏覽器引擎,python提供了許多庫可以調用這個引擎,dryscrape便是其中之一,它調用webkit引擎來處理包含js等的網頁!

2 selenium web測試框架

selenium是一個web測試框架,它允許調用本地的瀏覽器引擎發送網頁請求,所以,它同樣可以實現抓取頁面的要求。

3. python-webkit怎麼安裝

基於IE內核的瀏覽器直接用VB編寫即可。引用WEBbrowser就可以了。復雜的操作可能要實現某些介面,比如攔截下載事件等。這部分用VB比較復雜,用Delphi比較合適。 webkit有現成封裝的ActiveX,可以直接被VB調用。

4. python 安裝webkit_server報錯

下載源碼
安裝
mkdir build
cd build
../autogen.sh

出現錯誤提示:
automake: cannot open < gtk-doc.make: No such file or directory
sudo apt-get install gtk-doc-tools
繼續第二步
../autogen.sh

出現錯誤:
configure: error: You need the 'flex' lexer generator to compile WebKit
google 一下關於 flex的資料
Flex 是一個高效、免費的開源框架,可用於構建具有表現力的 Web 應用程序,這些應用程序利用 Adobe Flash Player和 Adobe AIR, 運行時跨瀏覽器、桌面和操作系統實現一致的部署。雖然只能使用 Flex 框架構建 Flex 應用程序,但Adobe Flash Builder™(之前稱為 Adobe Flex Builder™)軟體可以通過智能編碼、互動式遍歷調試以及可視設計用戶界面布局等功能加快開發。

5. 如何用Python開發一個簡單的Webkit瀏覽器

在這篇教程中,我們會用 Python 的 PyQt 框架編寫一個簡單的 web 瀏覽器。關於 PyQt ,你可能已經有所耳聞了,它是 Qt 框架下的一系列 Python 組件,而 Qt(發音類似「cute」)是用來開發GUI的 C++ 框架。嚴格來講, Qt 也可用於開發不帶圖形界面的程序,但是開發用戶界面應該是 Qt 框架最為廣泛的應用了。Qt 的主要優勢是可以開發跨平台的圖形界面程序,基於 Qt 的應用能夠藉助於各平台的原生性在不同類的設備上運行,而無須修改任何代碼庫。

Qt 附帶了webkit的介面,你可以直接使用 PyQt 來開發一個基於 webkit 的瀏覽器。

我們本次教程所開發的瀏覽器可以完成如下功能:

  • 載入用戶輸入的url

  • 顯示在渲染頁面過程中發起的所有請求

  • 允許用戶在頁面中執行自定義的 JavaScript 腳本

  • 牛刀小試

    讓我們從最簡單的 PyQt 的 Webkit 用例開始吧:輸入 url,打開窗口並在窗口中載入頁面。

    這個例子十分短小,連import語句和空行在內也只有 13 行代碼。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

  • import sys

    from PyQt4.QtWebKit import QWebView

    from PyQt4.QtGui import QApplication

    from PyQt4.QtCore import QUrl

    app = QApplication(sys.argv)

    browser = QWebView()

    browser.load(QUrl(sys.argv[1]))

    browser.show()

    app.exec_()

  • 當你通過命令行將 url 傳給腳本時,程序會載入 url 並且在窗口中顯示載入完成的頁面。

    現在,看似你已經有一個「命令行瀏覽器」啦!至少比 python 的 requests 模塊強多了,甚至比Lynx還略高一籌,因為我們的瀏覽器還可以載入 JavaScript 腳本呢。但是目前為止還沒有跟 Lynx 拉開差距,因為在啟用瀏覽器的時候只能通過命令行傳入 url。那麼,必然需要通過某種方式把需要載入的 url 傳入瀏覽器。沒錯,就是地址欄!

    添加地址欄

    其實地址欄的實現非常簡單,我們只需要在窗口頂端加一個輸入框就夠了。用戶在文本框中輸入 url 之後,瀏覽器就會載入這個地址。下面,我們將用到 QLineEdit 控制項來實現輸入框。鑒於我們的瀏覽器現在有地址欄和瀏覽器顯示框兩部分,因此還要給我們的應用增加一個網格布局。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

  • import sys

    from PyQt4.QtGui import QApplication

    from PyQt4.QtCore import QUrl

    from PyQt4.QtWebKit import QWebView

    from PyQt4.QtGui import QGridLayout, QLineEdit, QWidget

    class UrlInput(QLineEdit):

    def __init__(self, browser):

    super(UrlInput, self).__init__()

    self.browser = browser

    # add event listener on "enter" pressed

    self.returnPressed.connect(self._return_pressed)

    def _return_pressed(self):

    url = QUrl(self.text())

    # load url into browser frame

    browser.load(url)

    if __name__ == "__main__":

    app = QApplication(sys.argv)

    # create grid layout

    grid = QGridLayout()

    browser = QWebView()

    url_input = UrlInput(browser)

    # url_input at row 1 column 0 of our grid

    grid.addWidget(url_input, 1, 0)

    # browser frame at row 2 column 0 of our grid

    grid.addWidget(browser, 2, 0)

    # main app window

    main_frame = QWidget()

    main_frame.setLayout(grid)

    main_frame.show()

    # close app when user closes window

    sys.exit(app.exec_())

  • 到這里,我們已經有一個瀏覽器的雛形啦!看上去和當年的 Google Chrome 還有幾分相像呢,畢竟兩者採用了相同的渲染引擎。現在,你可以在輸入框中輸入 url ,程序便會將地址傳入瀏覽器,接著渲染出所有的 HTML 頁面和 JavaScript 腳本並展示出來。

    添加開發工具

    一個瀏覽器最有趣也最重要的部分是什麼?當然是各種各樣的開發工具了!一個沒有開發者控制台的瀏覽器怎麼能算是瀏覽器呢?所以,我們的 Python 瀏覽器當然也要有一些開發者工具才行。

    現在,我們就來添加一些類似於 Chrome 的開發者工具中 「Network」 標簽的功能吧!這個功能就是簡單地追蹤瀏覽器引擎在載入頁面的時候所執行的所有請求。在瀏覽器主頁面的下方,我們將通過一個表來顯示這些請求。簡單起見,我們只會記錄登錄的 url、返回的狀態碼和響應的內容類型。

    首先我們要通過 QTableWidget 組件創建一個表格,表頭包括需要存儲的欄位名稱,表格可以根據每次新插入的記錄來自動調整大小。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

  • class RequestsTable(QTableWidget):

    header = ["url", "status", "content-type"]

    def __init__(self):

    super(RequestsTable, self).__init__()

    self.setColumnCount(3)

    self.setHorizontalHeaderLabels(self.header)

    header = self.horizontalHeader()

    header.setStretchLastSection(True)

    header.setResizeMode(QHeaderView.ResizeToContents)

    def update(self, data):

    last_row = self.rowCount()

    next_row = last_row + 1

    self.setRowCount(next_row)

    for col, dat in enumerate(data, 0):

    if not dat:

    continue

    self.setItem(last_row, col, QTableWidgetItem(dat))

  • 想要追蹤所有請求的話,我們還需要對 PyQt 的內部構件有更深入的了解。了解到,Qt 提供了一個 NetworkAccessManager類作為 API 介面,通過調用它可以監控應用載入頁面時所執行的請求。我們需要自己編寫一個繼承自 NetworkAccessManager 的子類,添加必要的事件監聽器,然後使用我們自己編寫的 manager 來通知 webkit 視圖執行相應的請求。

    首先我們需要以 NetworkAccessManager 為基類創建我們自己的網路訪問管理器。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

  • class Manager(QNetworkAccessManager):

    def __init__(self, table):

    QNetworkAccessManager.__init__(self)

    # add event listener on "load finished" event

    self.finished.connect(self._finished)

    self.table = table

    def _finished(self, reply):

    """Update table with headers, status code and url.

    """

    headers = reply.rawHeaderPairs()

    headers = {str(k):str(v) for k,v in headers}

    content_type = headers.get("Content-Type")

    url = reply.url().toString()

    # getting status is bit of a pain

    status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)

    status, ok = status.toInt()

    self.table.update([url, str(status), content_type])

  • 在這里需要提醒大家的是, Qt 的某些實現並不像想像中那麼簡單明了,比如說從響應中獲取狀態碼就十分繁瑣。首先,你得把請求對象的類屬性作為參數傳入 response 的方法.attribute()中,.attribute()方法的返回值是 QVariant 類型而非 int 類型。接著,需要調用內置函數.toInt()將其轉換成一個包含兩個元素的元組,最終得到響應的狀態碼。

    現在,我們終於有了一個記錄請求的表和一個監控網路的 manager,接下來只要把他們聚攏起來就可以了。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

  • if __name__ == "__main__":

    app = QApplication(sys.argv)

    grid = QGridLayout()

    browser = QWebView()

    url_input = UrlInput(browser)

    requests_table = RequestsTable()

    manager = Manager(requests_table)

    # to tell browser to use network access manager

    # you need to create instance of QWebPage

    page = QWebPage()

    page.setNetworkAccessManager(manager)

    browser.setPage(page)

    grid.addWidget(url_input, 1, 0)

    grid.addWidget(browser, 2, 0)

    grid.addWidget(requests_table, 3, 0)

    main_frame = QWidget()

    main_frame.setLayout(grid)

    main_frame.show()

    sys.exit(app.exec_())

  • 現在,運行瀏覽器程序,在地址欄鍵入 url,就可以看到在主頁面下方的記錄表中記錄下的所有請求。

    如果你有興趣的話,還可以為瀏覽器添加很多新的功能:

  • 通過content-type添加篩選功能

  • 添加記錄表的排序功能

  • 添加計時器

  • 高亮顯示出錯的請求(比如說把錯誤信息置為紅色)

  • 顯示出更為具體的請求內容,比如說完整的頭信息、響應內容、請求方法等。

  • 增加一個重復發送請求並載入出來的選項。比如說用戶可以點擊在記錄表中的請求來重試請求。

  • 其實還有太多的功能可以繼續完善和改進,你可以一一嘗試一下,這會是一個非常有趣而且收獲良多的學習過程。但是如果想把這些功能都說完,估計都能寫一本書了。所以限於篇幅,本文就不一一介紹了,感興趣的朋友可以參考其他書籍和網上教程。

    增加解析自定義 JavaScript 腳本的功能

    我們終於迎來最後一個功能了!就是解析在頁面中包含的 JavaScript 腳本。

    基於我們之前已經打下的基礎,要完成這個功能非常簡單。我們只需要在添加一個 QLineEdit 組件,把它和頁面聯系起來,然後調用evaulateJavaScript方法就可以了。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

  • class JavaScriptEvaluator(QLineEdit):

    def __init__(self, page):

    super(JavaScriptEvaluator, self).__init__()

    self.page = page

    self.returnPressed.connect(self._return_pressed)

    def _return_pressed(self):

    frame = self.page.currentFrame()

    result = frame.evaluateJavaScript(self.text())

  • 下面是這個功能的示例。看,我們的開發者工具已經整裝待發了!

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

  • if __name__ == "__main__":

    # ...

    # ...

    page = QWebPage()

    # ...

    js_eval = JavaScriptEvaluator(page)

    grid.addWidget(url_input, 1, 0)

    grid.addWidget(browser, 2, 0)

    grid.addWidget(requests_table, 3, 0)

    grid.addWidget(js_eval, 4, 0)

  • 現在唯一缺少的就是在頁面中不能執行 Python 腳本。你可以開發自己的瀏覽器,提供對 JavaScript 和 Python 的支持,這樣其他開發者就可以針對你的瀏覽器開發應用了。

    後退、前進和其他頁面操作

    我們在前面已經使用了 QWebPage 對象來開發瀏覽器,當然作為一個合格的瀏覽器,我們也需要為終端用戶提供一些重要功能。Qt 的網頁對象支持很多不同操作,我們可以把它們全都添加到瀏覽器中。

    現在我們可以先嘗試著添加「後退」、「前進」和「刷新」這幾個操作。你可以在界面上添加這些操作按鈕,簡單起見,這里只加一個文本框來執行這些動作。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

  • class ActionInputBox(QLineEdit):

    def __init__(self, page):

    super(ActionInputBox, self).__init__()

    self.page = page

    self.returnPressed.connect(self._return_pressed)

    def _return_pressed(self):

    frame = self.page.currentFrame()

    action_string = str(self.text()).lower()

    if action_string == "b":

    self.page.triggerAction(QWebPage.Back)

    elif action_string == "f":

    self.page.triggerAction(QWebPage.Forward)

    elif action_string == "s":

    self.page.triggerAction(QWebPage.Stop)

  • 和之前一樣,我們要創建一個 ActionInputBox 的實例,把參數傳入頁面對象並把輸入框對象添加到頁面中。

    For reference here』s code for final result 示例代碼看這里

    [1]: Graphical User Interface,圖形用戶界面,又稱圖形用戶介面,是指採用圖形方式顯示的計算機操作用戶界面。

    [2]: WebKit是一個開源的瀏覽器引擎,與之相對應的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也稱 MSHTML ,IE 使用)。

6. 如何用Python抓取動態頁面信息

很早之前,學習Python web編程的時候,就涉及一個Python的urllib。可以用urllib.urlopen("url").read()可以輕松讀取頁面上面的靜態信息。但是,隨著時代的發展,也來越多的網頁中更多的使用javascript、jQuery、PHP等語言動態生成頁面信息。因此,用urllib再去抓取頁面HTML就不足以達到我們想要的效果。
回到頂部
解決思路:

有一個思路最為簡單的思路可以動態解析頁面信息。urllib不可以解析動態信息,但是瀏覽器可以。在瀏覽器上展現處理的信息其實是處理好的HTML文檔。這為我們抓取動態頁面信息提供了很好的思路。在Python中有一個很有名的圖形庫——PyQt。PyQt雖然是圖形庫,但是他裡面 QtWebkit。這個很實用。谷歌的Chrome和蘋果的Safari都是基於WebKit內核開發的,所以我們可以通過PyQt中得QtWebKit 把頁面中的信息讀取載入到HTML文檔中,再解析HTML文檔,從HTML文檔中提取我們想用得信息。
回到頂部
所需材料:
作者本人實用Mac OS X。應該在Windows和Linux平台也可以採用相同的辦法。
1、Qt4 library
Library,而不是Creator。Library在Mac的默認安裝路徑下,應該是/home/username/Developor/,不要改變Qt4的默認安裝路徑。否則可能安裝失敗。
官方網址:http://qt-project.org/downloads

2、SIP、PyQt4
這兩個軟體可以在在PyQt的官網找到。下載的是它的源碼。Mac和Linux需要自己編譯
下載地址是:http://www.riverbankcomputing.co.uk/software/pyqt/download
在終端切換到文件解壓後的目錄中。
在終端中輸入
python configure.py
make
sudo make install
進行安裝編譯。
SIP和PyQt4兩個安裝方法相同。但是PyQt4依賴SIP。所以先安裝SIP再安裝PyQt4

1、2兩步完成之後,Python的PyQt4的模塊就安裝好了。在Python shell中輸入import PyQt4看看能不能找到PyQt4的模塊。

3、Spynner
spynner是一個QtWebKit的客戶端,它可以模擬瀏覽器,完成載入頁面、引發事件、填寫表單等操作。
這個模塊可以在Python的官網找到。
下載地址: https://pypi.python.org/pypi/spynner/2.5
解壓後,cd到安裝目錄,然後輸入sudo python configure.py install安裝該模塊。
這樣Spynner模塊就安裝完成了,在python shell中試試import spynner看看該模塊有沒有安裝完成。

回到頂部
Spynner的簡單使用
Spynner的功能十分強大,但是由於本人能力有限,就介紹一下如何顯示網頁的源碼吧。
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#! /usr/bin/python
#-*-coding: utf-8 -*-

import spynner

browser = spynner.Browser()
#創建一個瀏覽器對象

browser.hide()
#打開瀏覽器,並隱藏。

browser.load("http://www..com")
#browser 類中有一個類方法load,可以用webkit載入你想載入的頁面信息。
#load(是你想要載入的網址的字元串形式)

print browser.html.encode("utf-8")
#browser 類中有一個成員是html,是頁面進過處理後的源碼的字元串.
#將其轉碼為UTF-8編碼

open("Test.html", 'w+').write(browser.html.encode("utf-8"))
#你也可以將它寫到文件中,用瀏覽器打開。

browser.close()
#關閉該瀏覽器


通過這個程序,就可以比較容易的顯示webkit處理的頁面HTML源碼了。

7. Mac 如何安裝 Python Webkit

安裝前必須知道的工作:
1、MAC OS 一般都自帶 MAC Python,Apple自己擴展的版本。例如,Lion是64位Python版本,自帶與Objctive C庫的介面模塊以及Apple系統的介面模塊。但安裝第三方與C、Fortran等相關的的Python模塊時,就必須從源碼編譯或使用專門編譯的64位二進制發行版。
2、安裝Python官方程序。從兼容的角度,Mac上可以安裝官方2.X版本。官方程序對MAC的支持和UNIX是一樣的,但與第三方模塊的兼容性無疑會更有保障。通常可以直接安裝許多二進制發行版。
3、本文關注在MAC Python上安裝Scipy等模塊。如果你使用官方Python版本,請直接訪問官方網站。
安裝工作:
1、安裝gFortran。由於部分庫函數是用Fortran實現的,所以要安裝與Xcode4.2兼容的Fortran編譯器。目前,沒有官方版本,請在這里下載。安裝後就可以使用gFortran了。如果你使用Xcode4.1或以前版本,請直接按Scipy官方網頁指令安裝。
2、自己從源代碼編譯,通常會需要解決太多問題。已有人編譯了實用於Lion和雪豹的64位版本,網頁這里。在命令行中使用如下命令下載:
$ git clone git://github.com/fonnesbeck/ScipySuperpack
下載目錄中包含安裝腳本和一組*.egg文件。
3、使用BBEdit或其他文本編輯工具編輯install_superpack.sh,刪除安裝Fortran的那段腳本。然後保存。
4、在命令行中使用如下命令:
$ sh install_superpack.sh
輸入y。 (不要輸入n!!!和網頁上說明的不一樣)
輸入你的開機密碼(管理員許可權),然後就自動安裝好了。
5、測試。輸入python
>>>import numpy as np
>>>np.test('full')
>>>import scipy
>>>scipy.test()
注意:有一些failure。

8. 如何用python解析網頁並獲得網頁真實的源碼

Python 2.7版本的話 代碼如下:

#!/usr/bin/env python
# -*- coding:utf8 -*-
import urllib
import urllib2
import string
import re

addr1 = 某個網址的地址(string format)
response1 = urllib.urlopen(addr1)
text1 = response1.read()
response1.close()

text1就是網頁的源代碼,可以print出來看。UTF8的代碼是為了確保能正確抓取中文。

9. 如何用Python爬取動態載入的網頁數據

動態網頁抓取都是典型的辦法

  1. 直接查看動態網頁的載入規則。如果是ajax,則將ajax請求找出來給python。 如果是js去處後生成的URL。就要閱讀JS,搞清楚規則。再讓python生成URL。這就是常用辦法

  2. 辦法2,使用python調用webkit內核的,IE內核,或者是firefox內核的瀏覽器。然後將瀏覽結果保存下來。通常可以使用瀏覽器測試框架。它們內置了這些功能

  3. 辦法3,通過http proxy,抓取內容並進行組裝。甚至可以嵌入自己的js腳本進行hook. 這個方法通常用於系統的反向工程軟體

熱點內容
oppo錄音文件在哪個文件夾 發布:2024-04-23 22:22:54 瀏覽:596
客戶端電腦與伺服器通訊發生錯誤 發布:2024-04-23 22:22:53 瀏覽:428
電腦原始伺服器名 發布:2024-04-23 22:01:52 瀏覽:55
21款發現5哪個配置透明引擎蓋 發布:2024-04-23 21:20:18 瀏覽:873
adb拷文件夾 發布:2024-04-23 21:12:25 瀏覽:10
如何破解wmv加密視頻 發布:2024-04-23 21:11:44 瀏覽:558
安卓拍抖音怎麼把聲音錄進去 發布:2024-04-23 20:58:51 瀏覽:847
安卓fifa15怎麼恢復數據 發布:2024-04-23 20:58:42 瀏覽:243
卸載oracle資料庫 發布:2024-04-23 20:36:26 瀏覽:522
發帖站源碼 發布:2024-04-23 20:22:45 瀏覽:683