在网上看到一篇使用程序增加个人空间人气的文章,大意是获取用户的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' % (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()
增加博客空间人气的脚本
增加博客空间人气的脚本
...