,,Python爬虫抓取论坛关键字过程解析

,,Python爬虫抓取论坛关键字过程解析

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: