采集时保持登录状态

有些网站页面中的部份信息需要登录后才可以看到,如果需要采集这部份信息,便需要在采集页面时保持用户登录的状态才行。
http协议是无状态的,所以服务器判断用户是否登录有两种办法,其一为 Session ,其二为 Cookies,而 Session 本质上来说是用 Cookies 保存一个 ID。因此要保持登录状态,就要在 Cookies 上做手脚。

如果用 Session 则在客户端保存一个名称为 xxxID ,值为 SessionID 的 Cookies,比如 php 的 Cookies 名称就是 PHPSESSID,而JSP,ASP 则未去确认。不过很多网站程序不买这个帐,象 Discuz,它不用 Session,而是自己建立一个特有的 Cookies 来判断用户登录状态,这个 Cookies 的名称可能会是 discuzID,也可能是其它。

因此,如果需要一个通用的,而不是只对应个别网站的保持登录的功能,就需要把网站的所有 Cookies 都保存下来,而不能只是单一个 PHPSESSID。

客户端所有的 Cookies 都保存在某个系统目录中,但去这个目录找 Cookies 太麻烦了。在访问一个网页时,浏览器会把这个网站的 Cookies 放在 http 请求信息中一并发送,因此,只要用抓包工具(如 smsniff)把浏览器的请求信息抓取出来,就可以快速地获得需要的 Cookies了,抓出来的 Cookies 看上去会象这样:

Cookie: __utma=218793553.606291007.1289973101.1290231316.1290233456.11;

然后,在 PHP 中用 fsockopen 函数自定义请求的头信息,把获取的 Cookies 信息加入到头信息中,就能保持登录状态了。

下面顺便说下采集时遇到的一些问题:

为了节省页面的传输时间,服务器可以对网页内容进行压缩,如gzip压缩,浏览器接收完数据后再对其进行解压缩。本来应该只要发送一个http头 Accept-Encoding: identity或者干脆不发送这个头等,就可以使目标站返回没有经过gzip压缩的页面了,不过很不幸,目标站无视客户端的请求,仍然返回gzip数据,造成乱码。
用 php 解压 gzip 数据参考
php对gzip文件或者字符串解压实例参考[http://www.chinaz.com/Program/PHP/12305R552008.html]

有时网站内容是分成几段传送的,在返回头信息中用 Transfer-Encoding chunked 表示内容分段传送,在每段信息之前都有一个表示本段信息长度的十六进制数据,如果内容是 html 影响则不大,但如果内容是 gzip 压缩过的数据,就必须把分段的信息合并为原始数据,不然无法正常解压。
用 php 还原 chunked 数据参考
php使用fsockopen读取分段数据(transfer-encoding: chunked)[http://be-evil.org/?post=173]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值