我们学校有个民主湖论坛,但是发现功能好不健全。比如你想看一个用户发的所有帖子是不可能的事,这可让很多想认识妹子的汉子,苦恼的不行。最近学Python爬虫程序,于是就写了个爬虫爬一下民主湖论坛,找到你想找的人的贴子。不过前提你必须先有他或她的一个帖子,然后把鼠标放到他的头像上,浏览器左下角有个UID值,记录下来,然后就可以在我们的爬虫中爬到你想要的人的所有帖子了。
本文先做了一个很简陋的爬虫,不需要登录民主湖论坛,不过有些板块是没办法爬取的。另外现在只能指定爬特定模块,比如我们想在“黄桷树下”模块内找到他发的所有帖子,那么我们将鼠标移动到“黄桷树下”,浏览器左下角出现Fid值,本程序就通过该值爬相应的模块。
程序中包含一个搜索函数,函数根据参数合成相应的URL地址,然后用Python模拟访问,抓取信息,然后通过正则表达式,获取每个帖子的作者,然后在和目标作者判断,如果匹配将该帖子的主题和连接保存到txt文件中。
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 06 18:13:48 2015
@author: KyleHuang
@Address: Chongqing University
"""
import re
import urllib2
def findAuthorArticle(authorId,Fid,pageStart,pageEnd):
urlstr='http://www.cqumzh.cn/bbs/forumdisplay.php?fid='+str(Fid);
matchstr='space.php?uid='+str(authorId)
for i in range(pageStart,pageEnd):
print u'爬虫爬到第'+str(i)+u'页'
#合成URL路径
urlstr2=urlstr+'&page='+str(i)
#模拟请求网址
request = urllib2.Request(urlstr2)
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)
myPage =response.read()
#匹配目标内容
myItems=re.findall('<a title=(.*?)>(.*?)</a></span>.*?<td align="center" style="overflow:hidden"nowrap="nowrap">\r\n<cite>\r\n<a href="(.*?)">(.*?)</a>',myPage,re.S)
for item in myItems:
#print item[1]+'authour='+item[2]
#f.writelines(item[1]+'authour='+item[2]+'\n\r')
str1=str(item[2])
#找到目标作者
if str1 == matchstr :
addr=getWebAdress(item[0])
info=item[0].replace('&','&')
print item[1]+','+info
#保存到文件
f.writelines(u'第'+str(i)+u'页,'+item[1]+','+info+'\n\r')
def getWebAdress(objStr):
addr=re.findall('.*?href="(.*?)"',objStr,re.S)
return addr[0]
if __name__=="__main__":
#此处输入搜索需要的信息
authorId=174384
Fid=83
start=1
end=500
print u"爬虫开始爬民主湖了 ......"
f = open('id'+str(authorId)+'.txt','w+')
f.writelines(u"作者"+str(authorId)+u"\n\r")
findAuthorArticle(authorId,Fid,start,end)
f.close()
本文为第一个爬虫程序比较简单。后续将实现全论坛无登陆的搜索,有登陆的搜索以及多线程加快搜索进度等功能。最后会尝试打包成EXE文件方便不会编程的想找某学校的人做朋友的人。