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读写ini文件的方法
May 28 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
python中scikit-learn机器代码实例
Aug 05 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
pytorch 归一化与反归一化实例
Dec 31 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
Python中的面向接口编程示例详解
Jan 17 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
2016/06/24 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
Vue组件化开发思考
2018/02/02 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
selenium+python实现自动化登录的方法
2018/09/04 Python
Python Web版语音合成实例详解
2019/07/16 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
Python3爬虫中识别图形验证码的实例讲解
2020/07/30 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
初三开学计划书
2014/04/27 职场文书
教师节宣传方案
2014/05/23 职场文书
人事任命书范文
2014/06/04 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
财务总监岗位职责
2015/02/03 职场文书
整改通知书
2015/04/20 职场文书
2015年派出所工作总结
2015/04/24 职场文书
心灵点滴观后感
2015/06/02 职场文书
python实现剪贴板的操作
2021/07/01 Python