
帖子已经死了,这就是现状. 据说,百度的帖子吧团没有新人加入,只允许退出而不允许进入,可以说是瘦弱的. 但是,作为第一个华人社区,它仍然具有很大的影响力. 同时,女友的工作性质与Post Bar无关,所以我正在准备这样的post bar监控助手项目.
此外,他开始分析舆论,大数据挖掘,并涉足前沿领域.
[外部链图像传输失败,源站点可能具有防盗链机制,建议保存图像并直接上传(img-2bfPyGib-1588146402090)(,2871723561&fm = 27&gp = 0.jpg) ]
Post Bar的性质与网易云仍然存在很大差异,因此方向也有所不同.
早期工作的困难在于判断柱杆的加载是否为ajax形式. 经过研究,发现虽然不是静态加载的贴吧监控,但旧版本的发布栏应该在几年前静态加载,然后匿名发布会爆炸并删除权限. 太猖leads导致今天的ajax形式,这也是大势所趋. 但是,网易云音乐有不同的分析请求. 尽管没有xhr或json格式的数据发布,但是幸运的是,该发布采用get的形式贴吧监控,并且没有加密的数据主体.
我收到的只是一个页面,该页面可能是由百度处理的. 至于为什么它不是json格式,那是因为它被禁止用作第三方客户端. 毕竟,百度自己的发布后客户端确实很难使用.
但是,在研究过程中,发现发布栏的网络版本尚未关闭,您无需登录即可查询所有相关建筑物,页面代码也更加友好. 因此,请切换到网络版本并发布
api地址为:
单个帖子
—9CC3CD881B0FE2BA30F4559A6AF8A941%3AFG%3D1-sz%40320_240%2C-1-3-0--2--wapp_1531379582221_177 / m?kw =%E6%9E%97%E4%BF%8A%E6%9D%B0&lp = 5011&lm =&pn = 0
关键字kw =林俊,pn =页面(0,20,40,60…)
首先要考虑的是您是否可以先制造轮子,这样逐步的过程可以促进整个项目的拆分和功能的阐明. 因此,首先尝试集成帖子栏的API,然后通过API调用后续的监视.
对于Web访问,经过多次尝试,我发现Tieba的Web终端可以直接访问而无需模拟手机. 但是,我们不知道它是否会在某个特定时间受到限制,因此我们为他模拟令牌.
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36'
头文件集成后,就可以开始编写API规则了.
我发现好的api的形式参数的设置特别清晰和聪明. 在这里,我们首先在帖子栏的主页上开发一个帖子ID集合,然后按页面返回. 因此,我需要知道调用者要访问哪个帖子,以及想要哪些参数页面. 没有无尽的爬行,所以这里是一个范围.
此处设置了三个参数
尽管键值是发布栏的关键字,但会影响关键字是否错误以及栏是否尚未建立(阻止)?这些情况都需要分析和处理. End需要关心的是密钥是否具有此页面,例如,一个新帖子,他只有3页帖子,但是我们希望将End设置为6,这显然不合适,因此我们必须处理在这里. Start和End存在相同的问题,但是从实际的角度来看,如果解决了Start,那么End将会解决.
Web端的页面数表达与PC端的不同,一页为20页,因此需要在此处进行转换:
Start = Start*20-20
# 防止出现输入0的情况
if Start == -20:
Start = 0
End = End*20
for i in range(Start,End,20)
在观察的第一页上(我们也以第一页为例),我需要的关键信息是帖子的标题,作者,时间和kz(ID),幸运的是,它们是全部以div的形式存储.
因此,只需使用BeautifulSoup即可在此处获取它:
Soup.select('div.i')
获得的内容:
实际上,您可以继续使用BeautifulSoup进行处理,但是为了节省麻烦,可以直接使用re正则表达式来解决.
pattern = re.compile('kz=(.*?)&.*?">(.*?)</a>.*?回([0-9]\d*)\s(.*?)\s(.*?)</p>',re.S)
几乎完成了,但是您需要修复标题并删除html上的代码,例如“ 11. \ xa0”.
接下来,为了成为第三方客户端(友好的用户),我们需要在此处进行分页过程.
Page = {
str(int((i + 20) / 20)): SouList
}
Son = {
'Id':items[0][0],
'Title':Title,
'Reply':items[0][2],
'Author':items[0][3],
'Time':items[0][4]
}
SouList.append(Son)
最后将此SouList转换为json
Result = json.dumps(ReturnJson,ensure_ascii=False)
唯一需要注意的是,在执行分配过程中,python的原理似乎是介绍性的. 我还在代码注释中提到了它,因此应该引入复制包
SuperList.append(copy.deepcopy(Page))
这基本上完成了api接口,返回的是json格式.
返回的结果:
验证结果
获取帖子的基本数据后,必须获取页面的内容. 网络上的帖子内容非常简洁,没有广告.
最重要的是,与Web端相比,基于Web的建筑物不受登录限制,您可以无条件获得任何我们想要的信息,唯一需要注意的是,每个建筑物的楼层数不确定,因此无法根据页数做出判断,而我试图了解其后果.
因此,Silai希望发现当建筑物的中间到达最后一页,并且没有内容时,没有“下一页”提示,因此我将“下一页”用作筛选的关键字.
ID是此处的唯一参数. 这部分与ID基本相同. 这里应该注意的是,第一层不同于其他建筑物,因此需要将其分为几种情况:
if count == 1 and page == 0:
pattern = re.compile('class="i">1楼.\s(.*?)<table>.*?<span /
class="g"><a href=".*?">(.*?)</a>.*?class="b">(.*?)</s', re.S)
items = re.findall(pattern, str(OneContent))
Text = items[0][0]
Author = items[0][1]
Time = items[0][2]
SonDict['Text'] = Text
SonDict['Author'] = Author
SonDict['Time'] = Time
SonDict['FloorInFloor'] = ''
FatherList.append(copy.deepcopy(SonDict))
else:
pattern = re.compile('class="i">\d*楼.\s(.*?)<table>.*?<span /
class="g"><a href=".*?">(.*?)</a>.*?class="b">(.*?)</span>.*?href="(.*?)">回复(.*?)</a>', re.S)
items = re.findall(pattern, str(OneContent))
Text = items[0][0]
Author = items[0][1]
Time = items[0][2]
Floor = items[0][4][1:-1]
# print(items)
FloorInFloor = []
if not (Floor == '' or Floor == None):
# print(items[0][2])
FloorInFloor = GetFloorInFloor(url=items[0][3])
SonDict['Text'] = Text
SonDict['Author'] = items[0][1]
SonDict['Time'] = Time
SonDict['FloorInFloor'] = FloorInFloor
FatherList.append(copy.deepcopy(SonDict))
FloorInFloor.clear()
SonDict.clear()
除了获取建筑物中间的建筑物的内容外,它还基于获得蠕虫的单个答复后建筑物中间的建筑物.
因此,在执行了与上述相同的处理后:
情感从头开始经历了三个步骤,这也是三个部分.
从您需要收集并获得相关帖子内容的帖子开始. 在这里,API的两个重要方法都被应用,可以称为收集阶段.
从需要分析的关键字开始. 分析第一部分以获得信息,对其进行分类和处理. 总体而言,第二部分是核心.
首先获取与关键字关联的内容,然后进行处理. 如何更直观地将内容呈现给需求者,是对经验和思想的考验.
与applet相比,这里需要一个配置文件来初始化参数. 因此,通过API和我刚才提到的第一部分,我列出了这些参数.
某些监视不需要实时反馈,因此这里我们以睡眠作为休息时间,然后经过一段时间的休息后再返回监视并收集.
很明显,我们监视的帖子和关键字不是单一的,因此我们使用configparser库读取配置文件并将它们都转换为列表,以方便程序的初始操作.
config = configparser.ConfigParser()
# 编码要设置成utf-8-sig而并不是utf-8
config.read('TiebaSetting.conf', encoding='utf-8-sig')
key = config.get("Setting", "tb")
keyList = key.split(',')
Essential = config.get("Customize", "Essential")
EssentialList = Essential.split(',')
# 休息周期
X = config.getint("Setting", "Sleep")
# 开始页数
Start = config.getint("Setting", "Start")
# 结束页数
End = config.getint("Setting", "End")
在这里,我将使用API中的GetID来获取所有ID. 在这里,我只需要ID. 将其加载到列表中后,我使用API的GetTiebaOne()方法获取帖子的内容. 获得所需的内容后,您必须开始处理.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-259397-1.html
往往都会导致行业混乱不堪
脸皮可真厚