更多>>关于我们
西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效获取互联网任何公开可见信息。
您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。
数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。
更多>>技术文章
项目主页:https://bitbucket.org/qi/django_web_proxy/overview
django_web_proxy是一个基于Django框架实现的Web(HTTP/伪HTTPS)代理方案,完全不依赖于Squid, Tinyproxy或者Haproxy.
既然有Squid这么成熟的HTTP代理软件,为何还要自己做一个不成熟的呢?
Squid代码难读,想修改定制自己的版本不容易. 喜欢Everything is in control!的感觉, 可以加入任意想要的功能. 例如 可以实现一个自己的Fiddler.
为何选用一个Web框架来开发呢?
嗯,的确有点不伦不类.最重要的原因就是这样很容易实现(HTTP代理本身和HTTP代理服务器就有很多相通的地方). 正如下面所提到的,本项目核心代码不超过100行(开发这个项目的时间还没有编写这个文档花的时间长).
优点是:
- 它很简单,核心代码不超过100行,支持HTTP Proxy Basic Authentication、IP Authentication、二级代理.
- 它是开源免费的,你可以任意修改,随意使用.
缺点是:
- 不支持原生的HTTPS,仅支持"服务端HTTPS"(我称这为"伪HTTPS代理",后面有详细的使用介绍).
- 暂不支持服务端长连接.
安装配置(以Ubuntu 14.04为例):
-
安装django1.3.1版本. 好几年没做Django开发了,机器上还是老版本的,顺便吐槽以下Django版本更新太快了,而且和老版本兼容不好.
-
让Django支持绝对路径URL(absolute url)的HTTP请求: 编辑
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py
文件,将两处r'^/'
修改为r'.*'
. PS:这一步很重要.因为Django默认只支持相对路径(必须是以/开头的路径)的URL请求,如果不修改,访问任何网站都会提示404错误. -
配置Apache + Django + mod_wsgi环境.
sudo apt-get install apache2 libapache2-mod-wsgi
-
部署django_web_proxy.
-
下载django_web_proxy源码,假设放在
/home/qi/django_web_proxy
路径下. -
修改Apache2站点配置文件
/etc/apache2/sites-available/default
,加入如下配置行(根据实际路径修改):
WSGIScriptAlias / /home/qi/django_web_proxy/django.wsgi
PS:注意,虚拟主机不能绑定域名,要设置为支持所有HOST,即“*:80”.
- 重启Apache2.
测试:
qi@kunzhipeng-server1:~$ curl -x 124.248.245.25:80 http://httpbin.org/ip { "origin": "124.248.245.25" }
关于伪HTTPS的使用:
由于Django框架的限制,没法直接实现一个支持CONNECT协议的标准HTTPS代理. 这里做了一个变通:
客户端(.e.g 爬虫) --HTTP(with SSL header)--> django_web_proxy --HTTPS--> HTTPS目标网站
客户端与django_web_proxy之间还是采用HTTP协议通信,django_web_proxy与目标网站之间通过HTTPS协议通信,我称这为“服务端HTTPS代理”或者“伪HTTS代理”.
-
不能再直接使用
https://
去访问目标网站了,因为这样的话客户端会使用标准的HTTPS代理协议(CONNECT)去和django_web_proxy通信,django_web_proxy是无法理解的. -
要将
https://
替换成http://
,然后添加一个名为SSL的请求头(值可以任意),这样django_web_proxy通过SSL标志头就可以知道这实际上是一个HTTPS的网站,django_web_proxy通过HTTPS协议访问目标网站.
例如,我们要下载https://www.alipay.com
,程序里需要使用http://www.alipay.com
,然后添加一个名为SSL的请求头(值可以任意),测试如下:
curl -x 124.248.245.25:80 -H 'SSL:1' http://www.alipay.com 省略大片应答数据...
如何证明上面的测试使用了HTTPS了呢,你可以试一下直接curl http://www.alipay.com
,返回的是一个到https://www.alipay.com/
的301跳转,如下测试:
qi@kunzhipeng-server1:~$ curl -I http://www.alipay.com HTTP/1.1 301 Moved Permanently Server: Tengine/2.1.0 Date: Wed, 15 Jun 2016 03:52:39 GMT Content-Type: text/html Content-Length: 284 Connection: keep-alive Location: https://www.alipay.com/ Set-Cookie: spanner=;path=/;secure;
这种伪HTTPS代理只适合爬虫使用,浏览器不支持。
DEBUG模式:
通过添加一个名为DEBUG的请求头(值可以任意)告知django_web_proxy采用DEBUG模式工作.
DEBUG模式工作时,django_web_proxy将会回送完整的请求报文和应答报文,如下测试:
qi@kunzhipeng-server1:~$ curl -x 124.248.245.214:80 -H 'DEBUG:1' -d 'name=Qi&sex=Male&age=30' http://httpbin.org/post POST http://httpbin.org/post HTTP/1.1 Proxy-Connection: Keep-Alive Accept: */* User-Agent: curl/7.35.0 Host: httpbin.org Debug: 1 Content-Type: application/x-www-form-urlencoded name=Qi&sex=Male&age=30 HTTP/1.1 200 content-length: 642 server: nginx connection: close access-control-allow-credentials: true date: Sat, 18 Jun 2016 06:55:36 GMT access-control-allow-origin: * content-type: application/json { "args": {}, "data": "", "files": {}, "form": { "age": "30", "name": "Qi", "sex": "Male" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip", "Accept-Language": "en-us,en;q=0.5", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Debug": "1", "Host": "httpbin.org", "Proxy-Connection": "Keep-Alive", "Referer": "http://httpbin.org/post", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:23.0) Gecko/20100101 Firefox/23.0" }, "json": null, "origin": "124.248.245.214", "url": "http://httpbin.org/post" }
项目主页:https://bitbucket.org/qi/django_web_proxy/overview