前言:

之前学习了用python爬虫的基本知识,现在计划用爬虫去做一些实际的数据统计功能。由于前段时间演员的诞生带火了几个年轻的实力派演员,想用爬虫程序搜索某论坛中对于某些演员的讨论热度,并按照日期统计每天的讨论量。

这个项目总共分为两步:

1. 获取所有帖子的链接:

将最近一个月内的帖子链接保存到数组中

2. 从回帖中搜索演员名字:

从数组中打开链接,翻出该链接的所有回帖,在回帖中查找演员的名字

获取所有帖子的链接:

搜索的范围依然是以虎扑影视区为界限。虎扑影视区一天约5000个回帖,一月下来超过15万回帖,作为样本来说也不算小,有一定的参考价值。

完成这一步骤,主要分为以下几步:

1. 获取当前日期

2. 获取30天前的日期

3. 记录从第一页往后翻的所有发帖链接

1. 获取当前日期

这里我们用到了datetime模块。使用datetime.datetime.now(),可以获取当前的日期信息以及时间信息。在这个项目中,只需要用到日期信息就好。

2. 获取30天前的日期

用datetime模块的优点在于,它还有一个很好用的函数叫做timedelta,可以自行计算时间差。当给定参数days=30时,就会生成30天的时间差,再用当前日期减去delta,可以得到30天前的日期,将该日期保存为startday,即开始进行统计的日期。不然计算时间差需要自行考虑跨年闰年等因素,要通过一个较为复杂的函数才可以完成。

today = datetime.datetime.now()

delta = datetime.timedelta(days=30)

i = "%s" %(today - delta)

startday = i.split(' ')[0]

today = "%s" %today

today = today.split(' ')[0]

在获得开始日期与结束日期后,由于依然需要记录每一天每个人的讨论数,根据这两个日期生成两个字典,分别为actor1_dict与actor2_dict。字典以日期为key,以当日讨论数目作为value,便于每次新增查找记录时更新对应的value值。

strptime, strftime = datetime.datetime.strptime, datetime.datetime.strftime

days = (strptime(today, "%Y-%m-%d") - strptime(startday, "%Y-%m-%d")).days

for i in range(days+1):

temp = strftime(strptime(startday, "%Y-%m-%d") + datetime.timedelta(i), "%Y-%m-%d")

actor1_dict[temp] = 0

actor2_dict[temp] = 0

3. 记录从第一页往后翻的所有发帖链接

如图1所示,采用发帖顺序排列,可以得到所有的发帖时间(精确到分钟)。右键并点击查看网页源代码,可以发现当前帖子的链接页面,用正则表达式的方式抓取链接。

首先依然是获取30天前的日期,再抓取第i页的源代码,用正则表达式去匹配,获取网页链接和发帖时间。如图2所示:

比较发帖时间,如果小于30天前的日期,则获取发帖链接结束,返回当前拿到的链接数组,代码如下

def all_movie_post(ori_url):

i = datetime.datetime.now()

delta = datetime.timedelta(days=30)

i = "%s" %(i - delta)

day = i.split(' ')[0] # 获得30天前的日子

print day

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

headers = { 'User-Agent' : user_agent }

post_list = []

for i in range(1,100):

request = urllib2.Request(ori_url + '-{}'.format(i),headers = headers)

response = urllib2.urlopen(request)

content = response.read().decode('utf-8')

pattern = re.compile('.*?(.*?)', re.S)

items = re.findall(pattern,content)

for item in items:

if item[1] == '2011-09-16':

continue

if item[1] > day: #如果是30天内的帖子,保存

post_list.append('https://bbs.hupu.com' + item[0])

else: #如果已经超过30天了,就直接返回

return post_list

return post_list

函数的传参是链接首页,在函数中修改页码,并继续搜索。

从回帖中搜索演员名字:

接下来的步骤也是通过一个函数来解决。函数的传参包括上一步中得到的链接数组,已经想要查询的演员名字(这个功能可以进一步扩展,将演员名字也用列表的形式传输,同时上一步生成的字典也可以多一些)。

由于虎扑论坛会将一些得到认可的回帖摆在前端,即重复出现。如图3所示:

为了避免重复统计,将这些重复先去除,代码如下:

if i == 0:

index = content.find('更多亮了的回帖')

if index >= 0:

content = content[index:]

else:

index = content.find('我要推荐')

content = content[index:]

去除的规则其实并不重要,因为每个论坛都有自己的格式,只要能搞清楚源代码中是怎么写的,剩下的操作就可以自己根据规则进行。

每个回帖格式大致如图4,

用对应的正则表达式再去匹配,找到每个帖子每一个回帖的内容,在内容中搜索演员名字,即一开始的actor_1与actor_2,如果搜到,则在对应回帖日期下+1。

最终将两位演员名字出现频率返回,按日期记录的字典由于是全局变量,不需要返回。

web_str = '(.*?) .*?.*?

[\s]*[\s]*(.*?)
' #找到回帖内容的正则

pattern = re.compile(web_str, re.S)

items = re.findall(pattern,content)

for item in items:

#if '引用' in item: #如果引用别人的回帖,则去除引用部分

#try:

#item = item.split('')[1]

#except:

#print item

#print item.decode('utf-8')

if actor_1 in item[1]:

actor1_dict[item[0]] += 1

actor_1_freq += 1

if actor_2 in item[1]:

actor2_dict[item[0]] += 1

actor_2_freq += 1

至此,我们就利用爬虫知识,成功完成对论坛关键字的频率搜索了。

这只是一个例子,关键字可以任意,这也不只是一个针对演员的诞生而写的程序。将演员名字换成其他词,就可以做到类似“您的年度关键字”这样的结果,根据频率大小来显示文字大小。

此文转载文,著作权归作者所有,如有侵权联系小编删除!

python爬虫论坛代码_如何使用Python爬虫 抓取论坛关键字出现频率!相关推荐

  1. python3爬虫项目代码_三个python爬虫项目实例代码

    这篇文章主要介绍了三个python爬虫项目实例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 爬取内涵段子: #encoding=utf-8 i ...

  2. python画动物代码_如何用python画简单的动物_后端开发

    python3.x完全兼容python2.x吗?_后端开发 可以说是完全不兼容.相对于Python的早期版本,Python3是一个较大的升级,为了不带入过多的累赘,Python 3.0在设计的时候没有 ...

  3. python简单的爬虫程序代码_简单的电子邮件爬虫Python代码

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import requests import re try: from urllib.pa ...

  4. python双重差分代码_即将开班 | Python数据挖掘与Stata应用能力提升与实证前沿寒假工作坊...

    1月25日上午 主讲人:邓旭东 课程安排:python语法入门 1.Python跟英语一样是一种语言 2.数据类型之字符串 3. 数据类型之列表元组集合 4. 数据类型之字典 5.数据类型之布尔值.N ...

  5. python嵌入c代码_怎样把Python代码嵌入到C程序

    匿名用户 1级 2017-11-03 回答 这篇文章主要介绍了将Python代码嵌入C++程序进行编写的实例,尽管通常还是Python代码中调用C++程序的情况较多...需要的朋友可以参考下 把pyt ...

  6. 用python画机器猫代码_如何用Python画一只机器猫?| 原力计划

    原标题:如何用Python画一只机器猫?| 原力计划 作者 | 人邮异步社区 责编 | 胡巍巍 出品 | CSDN博客 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自 ...

  7. python下面的代码_求下面python代码的差别。

    展开全部 题主32313133353236313431303231363533e78988e69d8331333433633436你好, 你不明白上面代码的原因,是因为你没弄明白python包导入的相 ...

  8. python项目软件代码_七套Python库快速提升您项目的代码可维护性,软件工程,代码库...

    保护项目未来可维护性的一种理想方式,在于利用外部库检查您的代码运行状况.以下是目前开发人员最喜爱的的代码梳理库,它们能够以强制方式执行一致性样式,并确保项目在成熟之后仍具备可接受的测试覆盖率. 当软件 ...

  9. python求表面积代码_用于计算python中的体积或表面积的良好算法

    我正在尝试计算3D numpy数组的体积(或表面积).在许多情况下,体素是各向异性的,并且我在每个方向上具有像素到厘米的转换因子. 有没有人知道找到工具包或包来做上述的好地方? 现在,我有一些内部代码 ...

最新文章

  1. java中io流实现哪个接口_第55节:Java当中的IO流-时间api(下)-上
  2. python学习笔记(二)---编辑工具sublimeText3运行python
  3. 如何在Java地毯下有效地清除问题
  4. cat命令详解_好程序员Python培训之详解eval好与坏
  5. GARFIELD@11-11-2004
  6. Android 视图(View)概述
  7. 这些Java面试题,你一定要记住!
  8. 数学专业学c语言,数学专业C语言教学方法研究.pdf
  9. 10个免费的web压力测试工具
  10. 关于zigbee协议栈各层的系统分析
  11. 填料吸收塔,填料教学实训,填料吸收实验系列QY-HGYL
  12. Python 批量发送邮件脚本
  13. day7-字典和集合作业
  14. Android O版本power按键锁屏亮屏流程
  15. Python如何释放内存
  16. 赵丽颖冯绍峰官宣 | 微博服务器瘫痪!运维:该拿什么拯救我?
  17. 高中电子技术——万用表的表笔接法(指针式和数字式)
  18. 微信小程序 09 前后端交互
  19. 软件智能:aaas系统中AI的任务能力和工作
  20. stc32G库函数(二)——定时器

热门文章

  1. winndows7、office2013 激活信息还原
  2. 基于SpringBoot的社区报修维修管理系统
  3. 水晶报表2008 条码打印 扫描
  4. 自动驾驶定位系统-Global Navigation Satellite Systems (GNSS)
  5. PyTorch-softmax,argmax,soft-argmax
  6. unity全栈开发是什么意思_前端所谓的全栈和大前端有什么区别?
  7. python实现UDP打洞
  8. git 修改 changeId
  9. web课程设计网页规划与设计:HTML+CSS美发设计题材——(洗发水官网5页)
  10. 摄影测量中的计算机视觉之3D homography