1.如何用Python开发一个简单的Webkit浏览器
让我们从最简单的 PyQt 的 Webkit 用例开始吧:输入 url,打开窗口并在窗口中加载页面。
这个例子十分短小,连 import 语句和空行在内也只有 13 行代码。Pythonimport sysfrom PyQt4.QtWebKit import QWebViewfrom PyQt4.QtGui import QApplicationfrom PyQt4.QtCore import QUrlapp = 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 控件来实现输入框。
鉴于我们的浏览器现在有地址栏和浏览器显示框两部分,因此还要给我们的应用增加一个网格布局。Pythonimport sysfrom PyQt4.QtGui import QApplicationfrom PyQt4.QtCore import QUrlfrom PyQt4.QtWebKit import QWebViewfrom PyQt4.QtGui import QGridLayout, QLineEdit, QWidgetclass 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 组件创建一个表格,表头包括需要存储的字段名称,表格可以根据每次新插入的记录来自动调整大小。
Pythonclass RequestsTable(QTableWidget): header = ["url", "status", "content-type"] def __init__(self): super(RequestsTable, self).__init__() self.setColumnCount(3) self.(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 为基类创建我们自己的网络访问管理器。
Pythonclass 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.) status, ok = status.toInt() self.table.update([url, str(status), content。
2.python爬取的网络数据嬖趍ysql中怎么实现
动态网页抓取都是典型的办法
直接查看动态网页的加载规则。如果是ajax,则将ajax请求找出来给python。 如果是js去处后生成的URL。就要阅读JS,搞清楚规则。再让python生成URL。这就是常用办法
办法2,使用python调用webkit内核的,IE内核,或者是firefox内核的浏览器。然后将浏览结果保存下来。通常可以使用浏览器测试框架。它们内置了这些功能
办法3,通过work python-pyside.qtopengl python-pyside.qtscript python-pyside.qtsql python-pyside.qtsvg python-pyside.qttest python-pyside.qtuitools python-pyside.qtwebkit python-pyside.qtxml (2)测试是否安装成功 dizzy@dizzy-pc:~$ python Python 2.7.3 (default, Feb 27 2014, 20:00:17) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information.>>> import PySide>>> dir(PySide) 代码如下:['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '__version_info__']>>> PySide.__version__'1.1.2'>>> PySide.QtCore.__version__'4.8.1' (三)PySide初试# -*- coding: utf-8 -*-# Import PySide classes import sys from PySide.QtCore import * from PySide.QtGui import *# Create a Qt application app = QApplication(sys.argv)# Create a Label and show it label = QLabel("Hello World") label.show()# Enter Qt application main loop app.exec_() sys.exit() 这样运行就能够看到一个最简单的窗口了。
Hello World。(四)Hello,PySide 第一个使用PySide的例子,新建一个Hello.py文件,然后输入下面的内容:# Import PySide classes import sys from PySide.QtCore import * from PySide.QtGui import * # Create a Qt application app = QApplication(sys.argv) # Create a Label and show it label = QLabel("Hello World") label.show() # Enter Qt application main loop app.exec_() sys.exit()。
5.python中return到底什么意思
return,就是函数返回传。
每一个函数都必须有一个返回值的,如果函数中没有写return,默认返回为None对象
比如:
def add(a,b):
return a+b
print add(2,3)
以上会得到输出5
而:
def add1(a,b):
c=a+b
print add1(2,3)
以上会输出None,因为函数没有return,所以add1没有返回值
转载请注明出处代码入门网 » pythonwebkit