本文主要介绍Python爬虫抓取论坛关键词的过程分析,通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友可以参考一下。
前言:
之前学习了python爬虫的基础知识,现在打算用它做一些实用的数据统计功能。前段时间《演员的诞生》带火了几个年轻的实力派演员,他们想用爬虫程序在某论坛搜索部分演员的讨论热度,按照日期统计每天的讨论量。
该项目分为两步:
1.获取所有帖子的链接:
将上个月的帖子链接保存到一个数组中。
2.从回复中搜索演员姓名:
从数组中打开链接,翻出链接的所有回复,在回复中寻找演员的名字。
获取所有帖子的链接:
搜索的范围还是以虎扑影视区为界。虎扑影视专区一天回复5000条左右,一月回复15万多条,作为样本不算少,有一定参考价值。
这个步骤主要分为以下几个步骤:
1.获取当前日期
2.获取30天前的日期
3.记录从第一页返回的所有发帖链接。
1.获取当前日期
我们在这里使用datetime模块。使用datetime.datetime.now()获取当前日期信息和时间信息。在这个项目中,只需要日期信息。
2.获取30天前的日期
使用datetime模块的好处是它还有一个非常有用的函数叫做timedelta,可以自己计算时差。当给定参数days=30时,会产生30天的时差,然后当前日期减去delta得到30天前的日期,日期保存为startday,即开始统计的日期。否则时差的计算需要考虑闰年等因素,只能通过更复杂的函数来完成。
今天=日期时间.日期时间.现在()
delta=datetime.timedelta(天数=30)
i='%s' %(今天-增量)
startday=i.split(' ')[0]
今天=' % s ' %今天
today=today.split(' ')[0]
得到开始日期和结束日期后,由于还需要记录每个人每天的讨论次数,所以根据这两个日期生成了两个字典,即actor1_dict和actor2_dict。字典以日期为键,以当天的讨论数为值,这样每次添加新的搜索记录时,对应的value值都会更新。
strptime,strftime=datetime . datetime . strptime,datetime.datetime.strftime
days=(strptime(今天,' %Y-%m-%d') - strptime(startday,' %Y-%m-%d ')。天
对于范围内的I(第1天):
temp=strftime(strptime(start day,' %Y-%m-%d') datetime.timedelta(i),' %Y-%m-%d ')
actor1_dict[temp]=0
actor2_dict[temp]=0
3.记录从第一页返回的所有发帖链接。
如图1所示,所有过账时间(精确到分钟)都可以通过使用过账顺序获得。并右键查看网页源代码,可以找到当前帖子的链接页面,通过正则表达式抓取链接。
第一步,获取30天前的日期,然后抓取第一页的源代码,用正则表达式匹配,得到网页链接和发帖时间。如图2所示:
对比过账时间。如果不到30天前,获取发布链接,并返回当前获取的链接数组,代码如下
def all_movie_post(ori_url):
i=datetime.datetime.now()
delta=datetime.timedelta(天数=30)
i='%s' %(i - delta)
day=I . split(')[0]#获取30天前的日期
打印日
user_agent='Mozilla/4.0(兼容;MSIE 5.5' Windows NT)'
headers={ '用户代理' :用户代理}
post_list=[]
对于在幅度内的I(1,100):
request=urllib2。请求(ori_url '-{} '。格式(I),标题=标题)
response=urllib2.urlopen(请求)
content=response.read()。解码(“utf-8”)
pattern=re.compile('a href='(。*?)' rel=' external no follow ' class=' true tit '。*?a style=' color:# 808080;光标:初始;'(.*?)/a ',re。s)
items=re.findall(模式,内容)
对于项目中的项目:
if item[1]=' 2011-09-16 ':
继续
If [1] day: #如果是30天内的帖子,保存它
post _ list . append(' https://BBS . hupu . com ' item[0])
Else: #如果超过30天,就回去
返回帖子列表
返回帖子列表
函数的参数是链接首页,在函数中修改页码,继续搜索。
从回复中搜索演员姓名:
下一步也是用一个函数解决的。函数的参数包括上一步得到的链接数组和已经想查询的演员名字(这个函数可以进一步扩展,以列表的形式传递演员名字,上一步生成的字典也可以更多)。
由于虎扑论坛会把一些审核通过的回复放在前端,所以会反复出现。如图3所示:
为了避免重复统计,先去掉这些重复,代码如下:
如果i==0:
Index=content.find(“更多突出显示的回复”)
如果索引=0:
内容=内容[索引:]
否则:
Index=content.find('我要推荐')
内容=内容[索引:]
其实规则是什么并不重要,因为每个论坛都有自己的格式。只要你能搞清楚它在源代码里是怎么写的,剩下的操作就可以自己按照规则来进行了。
每个回复的格式大致如图4所示,
用对应的正则表达式再次匹配,找到每个帖子的每条回复的内容,在内容中搜索演员的名字,也就是开头的actor_1和actor_2。如果找到,则在相应的回复日期下为1。
最后返回两个演员名字出现的频率,按日期记录的字典是全局变量,不需要返回。
web_str='span class='stime '(。*?) .*?/span。*?tbody[\s]*tr[\s]*td(。*?)br /' #找到回复内容的规律性。
pattern=re.compile(web_str,re。s)
items=re.findall(模式,内容)
对于项目中的项目:
# If ' b quote in item:#如果引用别人的回复,去掉引用的部分。
#尝试:
# item=item . split('/block quote ')[1]
#除了:
#打印项目
#print item.decode('utf-8 ')
如果actor_1在项目[1]中:
actor1_dict[item[0]]=1
演员_ 1 _频率=1
如果actor_2在项目[1]中:
actor2_dict[item[0]]=1
演员_ 2 _频率=1
到目前为止,我们已经成功地利用爬虫知识完成了论坛关键词的频率搜索。
这只是一个例子,关键词可以任意,这也不仅仅是一个为演员诞生而写的节目。把演员的名字换成其他词,就可以达到一个类似“你的年度关键词”的结果,按照频率显示文字大小。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。