当前位置:首页 » 编程语言 » 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. 这个方法通常用于系统的反向工程软件

热点内容
我的世界服务器自动扫地 发布:2024-05-04 03:48:41 浏览:611
4500能配什么电脑配置 发布:2024-05-04 03:22:29 浏览:591
阿U编程课堂 发布:2024-05-04 03:10:23 浏览:617
上传音乐搜音乐 发布:2024-05-04 03:10:23 浏览:600
编译器工作负载 发布:2024-05-04 03:06:09 浏览:421
摩斯编译 发布:2024-05-04 03:06:00 浏览:612
源码得反码 发布:2024-05-04 03:05:18 浏览:753
手机搜狐怎么上传视频 发布:2024-05-04 02:50:54 浏览:75
存储卡那里有卖 发布:2024-05-04 02:45:42 浏览:968
磁盘存储介质 发布:2024-05-04 02:44:19 浏览:436