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,即开始进行统计的日期。不然计算时间差需要自行考虑跨年闰年等因素,要通过一个较为复杂的函数才可以完成。

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

202010191147591.jpg

202010191147592.gif

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

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

202010191147593.jpg

202010191147592.gif

比较发帖时间,如果小于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所示:

202010191148004.jpg

202010191147592.gif

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

if i == 0:

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

if index >= 0:

content = content[index:]

else:

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

content = content[index:]

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

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

202010191148005.jpg

202010191147592.gif

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

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

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

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相对完善的Java通过JDBC操纵mysql的例子

工具类: Code1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.ResultSet; 4import java.sql.SQLException; 5import java.sql.Statement; 6 7 8public final class JDBCUtils { 910 private JDBCUtils(){}11 12 private static Strin…

如何在 ASP.Net Core 中使用 File Providers

ASP.Net Core 为了便于获取文件和文件夹信息,监视文件变更, 在文件系统中提供了一个抽象层:File Providers, 这篇文章将会讨论如何使用 File Providers 。File Provider 抽象层 file prodivers 实现了 IFileProvider 接口&#xf…

对5种主流编程语言的吐槽

不可否认,想要成为一名优秀的程序员确实是需要掌握多种编程语言。通过这几年的自虐式学习,小编也慢慢的掌握了这些编程语言。接下来要为大家,介绍五款让人又爱又恨的编程语言! 1.C 语言 C 语言给人的感觉,就是一位神秘…

WM中的OutLook开发和操作

昨天闲来无视,学习了一下WM的基本开发。看WM有约的那套教程心里痒痒,于是下载了SDK,看看DEMO,在Sample中的示例进行加工。小有一点心得。其实总的来说难度也不是很大,以前没有做过FORM的程序,都是WEB上面的…

苹果手机运行python_iPhone是卖的最好的手机?用Python照样把他玩弄鼓掌之间!

关于 iOS 的技术解读有很多,但是却鲜有设备可视化同步的介绍文章。本文一起了解下这个酷炫的 iOS 黑科技。我们的任务很简单——如上图所示,实时获取设备的当前方向。 UIDevice.current.orientation 首先,需要调用 beginGeneratingDeviceOrie…

这几个动图告诉你科学的神奇,看完瞬间觉得智商都提高了

生活中简单平常的事物和现象背后,往往有着奇妙的原理,赶快跟着一起来看看涨点知识吧! 夹心雪糕的制作原理 ▼ 难怪雪糕大小,厚度都一模一样 原来都是从一个模子里出来的 ▼ 煎饼可以统一翻面 再也不用担心烤焦了 ▼ 冰淇淋蛋筒的制…

自定义 ocelot 中间件输出自定义错误信息

自定义 ocelot 中间件输出自定义错误信息Introocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候就需要做一些自定义了,对 ocelot 中的 Response 中间件做了一些小改动,实现…

盘点小坏蛋的礼物

我们家小坏蛋一天天长大了,妈妈从觉得很辛苦过渡到习惯了很辛苦,苦中作乐的妈妈终于抽出空来写博客啦! 为什么叫他小坏蛋呢?因为他吃饭不乖。没满月的时候蛮乖的,每顿奶都吃的很香,咕咚咕咚的喝下去&#x…

为什么对gRPC做负载均衡会很棘手?

在过去的几年中,随着微服务的增长,gRPC在这些较小的服务之间的相互通信中获得了很大的普及,在后台,gRPC使用http/2在同一连接和双工流中复用许多请求。使用具有结构化数据的快速,轻便的二进制协议作为服务之间的通信介质确实很有吸…

给新手程序猿的16个必备小妙招

写在前面: 这个文章核心并不是程序优化的具体技巧,而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道 profiler 这个东西,通过搜索"代码 每一行 时间"也可以很快知道有这样的工具叫做 profiler,并且学…

python字符串设置字体_python怎么更改字符串后几位

python更改字符串后几位的方法:可以利用replace()函数来实现。replace()函数可以把字符串中的旧字符串替换成新字符串,并返回替换后的新字符串。具体使用方法如:【str.replace("is", "was")】。可以利用replace()函数来修…

程序猿的双十一最佳攻略

讲个恐怖故事 一年一度虐汪“光棍节”又来了 小天拍拍(不存在的)胸脯告诉大家 这个节日 我陪你们 买买买! 限时特惠专场 1 welcome 7天教你学会数学建模及Matlab编程 数学建模涉及的内容比较广泛,比如碎纸片问题中所涉及的图像识…

关于Word中审阅的一个问题!

前两天,在帮一个杂志撰稿的过程中,有一个关于Word审阅的问题。(以下内容以Word2007为例) 本身,审阅的应用不算困难。 我们可以为文章添加“批注”,或是你的上级对文章进行修改,他们可以开启“审…

ASP.NET Core - 在ActionFilter中使用依赖注入

上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题,还有一个就是依赖注入在ActionFilter上的使用也是需要注意的…

魏尔斯特拉斯函数与分形图形的动画演示

一般人会直觉上认为连续的函数必然是近乎可导的。即使不可导,所谓不可导的点也必然只占整体的一小部分。根据魏尔斯特拉斯在他的论文中所描述,早期的许多数学家,包括高斯,都曾经假定连续函数不可导的部分是有限或可数的。这可能是…

大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar

视频演示:问:HonmToolBar是一款什么样的插件?答:HonmToolBar是一款高度自由化的插件,用户可以自己增加宏文件按钮或者宏命令按钮。该插件类似工具栏,有水平和垂直两个工具栏。插件悬浮在PM图形窗口左上角&a…

android 导航 美国,变美了 Android N或用全新虚拟导航按键

原标题:变美了 Android N或用全新虚拟导航按键变美了 Android N或用全新虚拟导航按键【IT168 资讯】虽然距离谷歌Android N系统的发布已经有一段时间了,不过该系统目前仍旧属于内测阶段,短时间内仍难以迅速推广。另外也正是由于Android N正式…

python特性和属性_Python面向对象-类的特性及公私有属性 | 【韩涛博客】

构造函数 __init__ self.name name #属性,成员变量,字段 def sayhi() #方法,动态属性 公有属性 在类中直接定义的属性,大家都可以用 私有属性 __两个下划线定义,外部不可以访问,内部可以访问 class Role(o…

[Abp 源码分析]自动审计记录

点击上方蓝字关注我们0.简介Abp 框架为我们自带了审计日志功能,审计日志可以方便地查看每次请求接口所耗的时间,能够帮助我们快速定位到某些性能有问题的接口。除此之外,审计日志信息还包含有每次调用接口时客户端请求的参数信息,…

我的老公是枚码农

前两天看到一篇写程序员的爆文,虽然略显夸张,但也着实有趣。忽然想到身边人也是一枚码农,浑身上下也是浓厚的码农气息,遂也胡乱写了几笔,博君一笑,为了方便起见,就称其为“码农哥”。 1 码农哥还…