Python爬虫爬民主湖(5)-------------爬回复内容
来源:互联网 发布:国外美女直播软件 编辑:程序博客网 时间:2024/05/04 07:25
(本模块实现的功能仅仅作为学习交友,请不要不法只用)
mainjun提议我实现一下回复功能,本来最近比较忙,没想着现在做的,不过既然有人捧场,想想又不是太难,就试了一下,目测是可以工作的,但不是特别健全,就先贴上晚一点时间在慢慢修改更新。其实与前几篇不同之处也就是,正则表达式的内容,添加了正则回复帖子的内容。
缺点还是蛮多的,先提一下,有时间我会修改。
缺点:1,搜索时间延长,即使采用了线程池,其搜索时间还是很长,不过对于近几年注册的用户够用了。以后会试着优化线程池。将以模块为单元的线程模型改为页面模型,即先找到所有正则的回复页面,然后根据线程池个数平均分配业务,使每个线程具有相同的任务量。
2,现在每页也就只搜索一个回复页面,基本是够用了,一个回复页面最多可以回复50条信息,处了一些特别的帖子外,超过一个页面的真心不多。不过要实现全部回复页面的搜索也是可以的。
3,正则出的内容包含html代码,由于回复的格式多样化,提前纯文本内容难度大,所以就会包含些html代码,也能看,洁癖症患者绕道。
最近比较忙,有问题留言,不过不怎么会修改,请原谅。
PS:这个不知道叫不叫数据挖掘啊,感觉挺喜欢大数据的。
上代码吧!
(github:https://github.com/nianhua110/MZHFindUserContents)
# -*- coding: utf-8 -*-"""Created on Fri Mar 18 18:15:48 2015
遵守GPL协议可以爬到所有无需登录的模块本模块实现了民主湖的若干模块的回复内容的爬取,可以找到你想要的人的帖子及回复内容。输入参数: 用户ID 用户注册时间:需要登录查看@author: KyleHuang@Address: Chongqing University"""import re import urllib2import datetimeimport timeimport Queue, threading, sys from threading import Thread import time,urllib # working thread class Worker(Thread): worker_count = 0 def __init__( self, workQueue, resultQueue, timeout = 0, **kwds): Thread.__init__( self, **kwds ) self.id = Worker.worker_count Worker.worker_count += 1 self.setDaemon( True ) self.workQueue = workQueue self.resultQueue = resultQueue self.timeout = timeout self.start( ) def run( self ): ''' the get-some-work, do-some-work main loop of worker threads ''' while True: try: callable, args, kwds = self.workQueue.get(timeout=self.timeout) res = callable(*args, **kwds) #print "worker[%2d]: %s" % (self.id, str(res) ) self.resultQueue.put( res ) except Queue.Empty: break except : print 'worker[%2d]' % self.id, sys.exc_info()[:2] class WorkerManager: def __init__( self, num_of_workers=10, timeout = 1): self.workQueue = Queue.Queue() self.resultQueue = Queue.Queue() self.workers = [] self.timeout = timeout self._recruitThreads( num_of_workers ) def _recruitThreads( self, num_of_workers ): for i in range( num_of_workers ): worker = Worker( self.workQueue, self.resultQueue, self.timeout ) self.workers.append(worker) print 'add a task' def wait_for_complete( self): # ...then, wait for each of them to terminate: while len(self.workers): worker = self.workers.pop() worker.join( ) if worker.isAlive() and not self.workQueue.empty(): self.workers.append( worker ) #print "All jobs are are completed." def add_job( self, callable, *args, **kwds ): self.workQueue.put( (callable, args, kwds) ) print 'Add a task!' def get_result( self, *args, **kwds ): return self.resultQueue.get( *args, **kwds ) def findAuthorArticleWithoutLogin(authorId,date1): FidList={280:u'计算机技术',119:u'学术民主湖',14:u'江风竹雨',27:u'人文社科',63:u'好摄之徒',17:u'书香重大', 109:u'外语角',83:u'黄桷树下',123:u'鱼食天下',107:u'鱼游天下',30:u'激情天下',181:u'数码广场', 18:u'轻松一刻',92:u'老乡会所',195:u'健康大家谈',100:u'心语新缘', #234:u'曝光台', #103:u'张贴栏', #138:u'生物学院' #203:u'租房',218:u'兼职',180:u'民主湖超市' } #IterateList(authorId,100,FidList[100],date1) wm = WorkerManager(15) for fid in FidList: wm.add_job( IterateList, authorId,fid,FidList[fid],date1 ) wm.wait_for_complete() #等待工作完成def IterateList(authorId,Fid,FidName,date1): ###该函数主要用来遍历页 pageStart=1#从第一页访问 pageEnd=100#最多访问100页,结束 urlstr='http://www.cqumzh.cn/bbs/forumdisplay.php?fid='+str(Fid); #matchstr='space.php?uid='+str(authorId) for i in range(pageStart,pageEnd): print FidName+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() #print myPage #myItems=re.findall(u'<a title=".*?(\d{4}.*?)"href="(.*?)"',myPage,re.S) myItems=re.findall('<a title=".*?(\d{4}.*?)"href="(.*?)".*?>(.*?)</a></span>.*?<td align="center" style="overflow:hidden"nowrap="nowrap">\r\n<cite>\r\n<a href="(.*?)">(.*?)</a>',myPage,re.S) #myItems各项目说明 #0:时间 #1:帖子详细地址 #2:帖子标题 #3:作者ID for item in myItems: GetAuthorArticleAndReplyContent(item[1],authorId,item[2],FidName,i) #截断时间判断 length=len(myItems) date2=getItemPage(myItems[length-1][0]) #print date2 dderror=date2-date1 if dderror.days<0: returndef GetAuthorArticleAndReplyContent(urlshort,authourId,belongTopic,Fidname,pagenumber): #在当前页面查找与输入作者ID相关的帖子并记录下来,一个帖子下面所有的 #belongtTopic:为当前页面的主题帖 urlstr='http://www.cqumzh.cn/bbs/'+urlshort; request = urllib2.Request(urlstr) request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request) myPage =response.read() #print myPage #匹配目标内容 myItems=re.findall('<a href="space.php\?uid=(\d*)" target="_blank">(.*?)<td class="postauthor".*?</td>',myPage,re.S) for item in myItems: if item[0]==str(authourId): #找到相同的作者,提前作者的内容, st=item[1] fItems=re.findall('<table cellspacing="0" cellpadding="0">(.*?)</table>',st,re.S); #fItems=re.findall('[\u4e00-\u9fa5]',st,re.S); print belongTopic+u'-----回复内容' print fItems[0]; if mutex.acquire(1): f.writelines('***************************************************************************************************\n\r') f.writelines(str(Fidname)+u',第'+str(pagenumber)+u'页,'+str(belongTopic)+u',中发表或回复了,\n\r'+str(urlstr)+'\n\r'+fItems[0]+'\n\r') mutex.release()def getWebAdress(objStr): addr=re.findall('.*?href="(.*?)"',objStr,re.S) return addr[0]def getItemPage(objStr): mItems=re.findall('\d{4}-\d{1,2}-\d{1,2}',objStr,re.S) mdate=datetime.datetime.strptime(str(mItems[0]), "%Y-%m-%d") return mdateif __name__=="__main__": #此处输入搜索需要的信息 authorId=raw_input(u'请输入作者ID:'); registerDate =raw_input(u'请输入开始日期,(作者注册时间),格式:xxxx-xx-xx'); dd=datetime.datetime.strptime(registerDate, "%Y-%m-%d") print u"爬虫开始爬民主湖了 ......" mutex=threading.Lock() f = open('Cid'+str(authorId)+'.txt','w+') f.writelines(u"作者"+str(authorId)+u"\n\r") findAuthorArticleWithoutLogin(authorId,dd) f.close()
0 0
- Python爬虫爬民主湖(5)-------------爬回复内容
- Python爬虫爬学校民主湖(4)------------模拟登录
- Python爬虫爬学校论坛民主湖-------------一个版面的搜索
- python爬虫爬学校民主湖论坛(3)----------多线程搜索帖子
- Python爬学校论坛民主湖(2)---------实现多个版块搜索
- Python网络爬虫入门(五)—— 巧用抓包,爬遍SCU玻璃杯事件所有神回复
- python爬虫爬取csdn博客专家所有博客内容
- Python爬虫爬取百度百科内容实例
- python爬虫爬取内容中,-xa0,-u3000的含义
- python爬虫爬取内容中,-xa0,-u3000的含义
- python爬虫爬取内容中,\xa0,\u3000的含义
- python爬虫爬取内容中,\xa0,\u3000的含义
- PYTHON爬虫学习-糗事百科内容爬取
- python爬虫入门:2--爬取百度贴吧内容
- 【Python数据分析】简单爬虫,爬取知乎神回复
- 爬虫三部曲之(三):Python模拟登录云笔记网站并爬取笔记内容
- python爬虫:爬去Json响应内容(第六感别墅度假别墅列表)学习笔记
- Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)
- poj2763 修改边权的LCA
- Lua基础 函数(二)
- 一次谷歌面试趣事
- android项目中values中ids.xml的作用
- SQL2005分页存储过程(支持多表联接)
- Python爬虫爬民主湖(5)-------------爬回复内容
- Lua基础 语句
- Android 高斯模糊 renderscript 兼容4.0以下报错android.support.v8.renderscript.RSRuntimeException: Error loadin
- jdk与jre的区别
- PC端 java 开发蓝牙所遇到的问题
- Objective-C 中导航字体颜色改变
- kali linux vmware 11 安装上了,系统很慢,挂载了windows的ntfs文件系统,然后启动了,,,,
- SESSION研究
- Linux下串口编程