Archive for 算法-编程

对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看。 这是因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登录了呢?有两种方式: 在URI 中显式地使用 Session ID; 利用 Cookie,大概过程是登录一个网站后会在本地保留一个 Cookie,当继续浏览这个网站的时候,浏览器会把 Cookie 连同地址请求一起发送过去。 Python 提供了相当丰富的模块,所以对于这种网络操作只要几句话就可以完成。我以登录 QZZN 论坛为例,事实上下面的程序几乎所有的 PHPWind 类型的论坛都是适用的。 <pre lang="python"># -*- coding: GB2312 -*- from urllib import urlencode import cookielib, urllib2 # cookie cj = cookielib.LWPCookieJar() opener = urllib2.build_opener(urllib2.HTTPCookiePr

Continue

<pre lang="python"> # -*- coding: utf-8 -*- import re import urllib import urllib2 import cookielib #获取CSDN博客标题和正文 url = "http://blog.csdn.net/[username]/archive/2010/07/05/5712850.aspx" sock = urllib.urlopen(url) html = sock.read() sock.close() content = re.findall('(?<=blogstory">).*(?=<p class="right artical)', html, re.S) content = re.findall('<script.*>.*</script>(.*)', content[0], re.S) title = re.findall('(?<=<title>)(.*)-.* - CSDN.*(?=

Continue

&nbsp; 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写google music的抓取脚本的,结果有了强大的gmbox,也就不用写了。 - 这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,再加上simplecd这个半爬虫半网站的项目,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重复劳动了。 <strong>1.最基本的抓站</strong> <pre lang="python">import urllib2 content = urllib2.urlopen(‘http://XXXX’).read()</pre> <strong>2.使用代理服务器</strong> 这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等。 <pre lang="python">import urllib2 proxy_support = urllib2.ProxyHa

Continue

在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例javascript代码: ($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) 这是一段完全合法的javascript代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文) 这段代码的好处(对于黑客)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的JSON,于是很可能会简单判断了一下其中不含字母就直接eval了,结果给黑客们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样的原理,完全可以干出更复杂的事,例如alert(document.cookie)。更重要的是,这段代码再一次提醒我,黑客的想象力是无限的……正如Ryan Barnett的演讲

Continue

尤其是利用”异或“运算,实现交换两个值,而不用临时变量。 通常我们交换两个值,都是用一个临时的变量temp,拿交换a,b的值为例,通常的做法是:temp = a;a = b;b = temp;不过利用位运算,真的是方便很多: 假如 a = 3,b = 4。想将a和b的值互换,可以用一下赋值语句实现: a = a ^ b; b = b ^ a; a = a ^ b; 下面用竖式进行简单说明:(10进制化为二进制) a = 011 (^) b = 100 则 a = 111(a ^ b的结果赋值给a,a已变成了7) (^) b = 100 则 b = 011(b^a的结果赋给b,b已经变成了3) (^) a = 111 则 a = 100(a^b的结果赋给a,a已经变成了4) 从上面的竖式可以清楚的看到利用异或运算实现两个值交换的基本过程。

Continue

几个比较大的在线提交系统(Online Judge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C /C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很 怪),你的程序的输出和标准输出完全符合即可。常见的返回信息有AC(Accepted,通过)WA(Wrong Answer,输出有错 误)TLE(Time Limit Exceeded,超时)MLE(Memory Limit Exceeded,内存溢 出)RE(Runtime Error,发生实时错误)等,只有AC了才算做对一题。这里只是一个简要介绍,请大家在做题时先看看各网站上的 FAQ,Enjoy it~~~ 杭电acm http://acm.hdu.edu.cn 编程爱好者ACM题库 http://www.programfan.com/acm/ Enjoy ACM Life http://acm.asus.com.cn 清华ACM http://acm.l

Continue