在网上看到一篇使用程序增加个人空间人气的文章,大意是获取用户的id号,然后使用爬虫将所有的空间/博客爬一遍,这样自己的头像就出现在别人空间的最近访客中 了。出于好奇,被访问的人可能会回访,从而达到自己空间的访问率增加。如果按2%的概率来算,那么去爬1万个空间也就有200个人回访了。这个比较有意 思,比找代理去刷自己空间的强,毕竟是真的有人来看了,就像真的做了一回广告一样。也不用做自动关水机(为了博客得已发表,不得已故意写了错别字),自然也不会引起对方的反感。

     根据这个思路,我昨天花了十几分钟调试出来了一个脚本,将百度空间的12×256个用户访问了一遍,可惜收效甚微,没有看到访问量有大幅增加。我想,要么是访问的空间太少了,要么就是程序出错了,要么就是回访的概率太少。写着玩的,无所谓了,呵呵。

    进一步的思路有:让爬虫终日在网络上爬行(自己的机器或者使用GAE),多线程,每访问一个空间就顺便访问他的最近访客或者好友链接,从而实现蜘蛛爬行,这样源源不断地获得访问地址。

     参考代码如下,仅供学习研究Python使用,不可用于其他非法目的。

# -- coding: utf-8 --
#coding = utf-8

import time
import urllib,urllib2,httplib,cookielib,os,socket
from sgmllib import SGMLParser


###==================================================================
def get_url_data(url):
    nFail = 0
    while nFail < 5:
        try:
            sock = urllib.urlopen(url)
            htmlSource = sock.read()
            sock.close()
            return htmlSource
        except:
            nFail += 1
    print "get url fail:%s" % (url)
    return None

###==================================================================
class classLister_hi(SGMLParser):
    """解析页面,获得要访问的url列表"""
    def reset(self):         
        SGMLParser.reset(self)
        self.urls = []
        self.bScope = False

    def start_td(self, attrs):
        self.bScope = False
        myclass = [v for k, v in attrs if k==‘width’]
        try:
            if myclass[0] == ‘297’:
                self.bScope = True
        except:
            pass
   
    def start_a(self, attrs):
        if self.bScope:
            href = [v for k, v in attrs if k==‘href’]
            if href:
                self.urls.extend(href)
                self.bScope = False
   
###==================================================================
def main(name = ‘这里填百度用户名’,pwd = ‘这里填密码’):
    #socket.setdefaulttimeout(200)       
    url_login="http://passport.baidu.com/?login"
   
    cookie=cookielib.CookieJar()
    cj=urllib2.HTTPCookieProcessor(cookie)
   
    postdata=urllib.urlencode({‘username’:name,‘password’:pwd,‘mem_pass’:1})  
    request=urllib2.Request(url_login,postdata)
   
    opener=urllib2.build_opener(cj)
    #伪装成浏览器
    opener.addheaders = [("User-Agent","Mozilla/4.0 (compatible; MSIE 7.1; Windows NT 5.1; SV1)"),]   
    opener.open(request)

    #担心多次登录被封,只登录一次,连续爬行。也不没敢引入多线程。
    for loop in range(1,287):
        print "loop = %d" % (loop)
        url    = ‘http://hi.baidu.com/hi/more/wonderful/good0/%d.html'&nbsp;&nbsp;  % (loop)

        htmlContent = get_url_data(url)
        if htmlContent == None:
            continue
        parser = classLister_hi()
        parser.feed(htmlContent)
        parser.close()

        for url_hi in parser.urls:
            print "visit url:",url_hi
            try:
                opener.open(url_hi)
            except:
                print "fail to open url: %s" % (url_hi)
            time.sleep(6)#不知道百度有没有防爬机制,为了不让自己的空间被封,加6秒钟延时
        time.sleep(20)#为了不让自己的空间被封,加20秒钟延时,应该可以减小

if name == "main":
    print "login baidu"
    main()