我最近写了一个类似的网络应用程序。请注意,这就是我的做法。我并不是说你应该这样做。以下是我遇到的一些陷阱:
将属性值从相对值更改为绝对值
涉及的不仅仅是获取页面并将其呈现给客户端。很多时候,您无法在没有任何错误的情况下代理网页。
为什么像我指出的那样某些网站根本无法运行?
许多网页依赖于资源的相对路径,以便以格式良好的方式显示网页。例如,这个图像标签:
<img src="/header.png" />
将导致客户端发出请求:
http://proxyurl/header.png
这失败了。这 'src' 值应转换为:
http://anothersite.com/header.png.
所以,你需要用类似的东西来解析 HTML 文档美丽汤 http://www.crummy.com/software/BeautifulSoup/, 循环所有标签并检查属性,例如:
'src', 'lowsrc', 'href'
And 改变他们的价值观相应地,标签变为:
<img src="http://anothersite.com/header.png" />
此方法不仅适用于图像标签,还适用于更多标签。a, script, link, li and frame有一些你也应该改变。
HTML 恶作剧
前面的方法应该能让你走得很远,但你还没有完成。
Both
<style type="text/css" media="all">@import "/stylesheet.css?version=120215094129002";</style>
And
<div style="position:absolute;right:8px;background-image:url('/Portals/_default/Skins/BE/images/top_img.gif');height:200px;width:427px;background-repeat:no-repeat;background-position:right top;" >
是难以访问和修改的代码示例美丽汤 http://www.crummy.com/software/BeautifulSoup/.
在第一个示例中,有一个 css @Import 到相对 uri。第二个涉及‘url()' 内联 CSS 语句中的方法。
在我的情况下,我最终编写了可怕的代码来手动修改这些值。您可能想为此使用正则表达式,但我不确定。
重定向
使用 Python-Requests 或 Urllib2,您可以轻松地自动跟踪重定向。只需记住保存新的(基本)uri 是什么;您将需要它来执行“将属性值从相对值更改为绝对值”操作。
您还需要处理“硬编码”重定向。比如这个:
<meta http-equiv="refresh" content="0;url=http://new-website.com/">
需要改为:
<meta http-equiv="refresh" content="0;url=http://proxyurl/http://new-website.com/">
Base tag
The base tag http://www.w3schools.com/tags/tag_base.asp指定文档中所有相对 URL 的基本 URL/目标。您可能想更改该值。
终于完成了?
没有。一些网站严重依赖 JavaScript 在屏幕上绘制内容。这些网站是最难代理的。我一直在考虑使用类似的东西PhantomJS http://phantomjs.org/ or Ghost http://jeanphix.me/Ghost.py/获取并评估网页并将结果呈现给客户端。
也许我的源代码 https://github.com/nattewasbeer/dushi.py-web/blob/master/bin/webdushi.py#L26可以帮你。您可以按照您想要的任何方式使用它。