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


Posted in Python onOctober 19, 2020

前言:

之前学习了用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.记录从第一页往后翻的所有发帖链接

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

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

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

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

比较发帖时间,如果小于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('<a href="(.*?)" rel="external nofollow" class="truetit" >.*?<a style="color:#808080;cursor: initial; ">(.*?)</a>', 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所示:

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

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

if i == 0:
        index = content.find('更多亮了的回帖')
        if index >= 0:
          content = content[index:]
        else:
          index = content.find('我要推荐')
          content = content[index:]

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

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

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

用对应的正则表达式再去匹配,找到每个帖子每一个回帖的内容,在内容中搜索演员名字,即一开始的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(pattern,content)
      for item in items:
        #if '<b>引用' in item: #如果引用别人的回帖,则去除引用部分
          #try:
            #item = item.split('</blockquote>')[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中处理字符串之isdigit()方法的使用
May 18 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
Python装饰器简单用法实例小结
Dec 03 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
Django框架 Pagination分页实现代码实例
Sep 04 Python
python取均匀不重复的随机数方式
Nov 27 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
Python的pygame安装教程详解
Feb 10 Python
python MD5加密的示例
Oct 19 #Python
python Yaml、Json、Dict之间的转化
Oct 19 #Python
Python pip 常用命令汇总
Oct 19 #Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 #Python
python Tornado框架的使用示例
Oct 19 #Python
python mock测试的示例
Oct 19 #Python
python 提高开发效率的5个小技巧
Oct 19 #Python
You might like
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
图片完美缩放
2006/09/07 Javascript
javascript中的几个运算符
2007/06/29 Javascript
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Django之腾讯云短信的实现
2020/06/12 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
最新自我评价范文
2013/11/16 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
师范生求职信
2014/06/14 职场文书
2014年维稳工作总结
2014/11/18 职场文书
预备党员个人总结
2015/02/14 职场文书
红楼梦读书笔记
2015/06/25 职场文书
个人欠条范本
2015/07/03 职场文书