爬⾍爬取知乎评论并利⽤flask框架做简单的可视化
学完⼀点简单的爬⾍技术后,直接开始实践…
将知乎的某个评论内容爬取下来,取出⾥⾯的关键字,并按照点赞数排序,形成⼀个表单,点击查看,可以看到原来的内容,⽐如下⾯这个⽹页:
from selenium import webdriver # 控制滚动条
from time import sleep # 时间控制
from bs4 import BeautifulSoup # ⽹页解析获取数据
代码
# 获取⽹页HTML内容
def gethtml(url):
driver = webdriver.Chrome()# 初始化⼀个浏览器
driver.maximize_window()# 设置窗⼝最⼤化
<(url)# 打开⽹页
temp_h =0# 设置⼀个⾼度为 0
js ="var q=document.documentElement.scrollTop=100000"
sleep(3)# 等待三秒,向远程
count =100
while count >0:# 这⾥设置的循环⼀百次,想爬取完全可以改为True
count -=1
sleep(3)
check_h = ute_script("return document.documentElement.scrollTop;")# 获取当前滑动条的位置
if check_h == temp_h:
sleep(3)# 如果相等,等待3秒⽹速加载
check_h = ute_script("return document.documentElement.scrollTop;")
if check_h == temp_h:
break# 如果还相等,说明滑动条已经跳到下,评论全部加载完成,跳出循环
temp_h = check_h # 将获取的⾼度设置为初始⾼度
html = BeautifulSoup(driver.page_source, features="html.parser")# 使⽤解析器,解析获取的HTML内容
driver.close()# 关闭浏览器
return html
第⼆步:解析内容
需要导⼊的库:
import jieba # 分解词汇
import re # 正则表达式进⾏⽂件匹配
import os # 创建⽬录
import requests # 下载图⽚
代码:
# 解析⽹页数据
def getData(baseurl, headers):
findAgree = repile(r'<button class="Button Button--plain" type="button">(.*?) ⼈赞同了该回答</button>')# 查点赞⼈数的正则表达式
吴亦凡工作室回应
findContent = repile(r'<p data-pid=".*?">(.*?)</p>|<img class="origin_image zh-lightbox-thumb lazy" data-actualsrc="(.*?)"', re.S)
# 查item⽂本内容和图⽚,⾥⾯的超链接,代码,和列表等内容也可以创建正则表达式筛选出来,我就没写了
data =[]# ⽤来存所有解析好的数据
html = gethtml(baseurl)# 调⽤获取上⼀步获取html代码的函数
if ists("image"):
<("image")
os.mkdir("image")# 创建⼀个image⽂件夹,存爬取的图⽚,如果已经存在,就删除
for item in html.find_all('div', class_="List-item"):# 解析每⼀条,div⾥⾯class="List-item"的数据
datalist =[]# ⽤来存每⼀条解析完的数据
item =str(item)# 将item改为字符串格式
agree = re.findall(findAgree, item)# 点赞⼈数更改格式
if not agree:# 如果点赞⼈数列表为空就跳出(那是因为我爬取了⼏次发现最后⼀次的点赞⼈数都为空,会报错)
break
temp = agree[0].replace(",","")# 去掉数字⾥⾯的","
if int(temp)<5:啤酒的功效与作用
continue# 点赞数⼩于5 表⽰不是我们感兴趣的数据
content = re.findall(findContent, item)# ⽤正则表达式查所有内容
stxt =""# ⽤来存查关键字的⽂本
image =[]# ⽤来存需要爬取的图⽚的url
newcontent =""# ⽤来存添加了HTML标签、最后可以直接展⽰出来的内容
for i, j in content:
if i =='':
if j =="":# 有可能图⽚也会存在为空的情况,要排除
最早的人类是哪国人continue
image.append(j)# 如果content⾥⾯的第⼀项为空,那就说明这次是取到的图⽚url,具体content的样式⾃⼰可以输出来看⼀看,就明⽩了
newcontent +='<img src="static/image/'+ j[26:57]+'.jpg"/><br/>'# 给本地的图⽚添加HTML标签:src路径 + 在本地保存的图⽚名else:# 下⾯就是content⾥⾯取到的⽂本内容
if i.find("<a class=")==-1:# 查超链接标签,没到
i = re.sub(r'<img alt=.*?/>','', i)# 去掉知乎的样式图⽚
stxt += i # 将取出来的⽂本加⼊stxt中,⽤来取出关键字
i = i +'<br/>'# 加上换⾏标签
else:# 到了超链接标签
i = re.sub(r'<span><a class=.*?target="_blank">','', i)
i = re.sub(r'<svg class=.*?</a></span>','', i)
i = re.sub(r'<a class=.*?</a>','', i)# 去掉所有超链接内容
i = re.sub(r'<img alt=.*?/>','', i)
stxt += i
i = i +'<br/>'
newcontent += i # 将取到的内容放到新的内容中
kword = findkword(stxt)# 查关键字
if kword ==0:# 返回0 不存储
continue
datalist.append(temp)# 1、存点赞数
datalist.append(kword)# 2、存关键字
datalist.append(newcontent)# 3、存总⽂本
print("爬取图⽚中...")# 下载图⽚
for i in image:
path ="image/"+ i[26:57]+".jpg"# 下载到本地的路径
while True:
try:
req = (i, headers=headers, stream=True, timeout=3)# 向图⽚的url请求情侣空间怎么弄>邓亚萍第二任丈夫
break# ⼀直死循环爬取,爬取不到不出循环,并不是每次都能爬取成功
ptions.RequestException as e:
continue
with open(path,"wb")as f:# 打开⽂件,保存图⽚到本地
f.t)
print("爬取图⽚完毕")
data.append(datalist)# 添加到需要返回的列表中
return data
查关键字的函数:
# 查关键字
def findkword(stxt):
excludes =["⽤户","可以","我们","这个","⼀个","于是","⼤家","这些","--------","-------------------","---------","span","div","class","id"]
# ⼀些不属于我们需要的内容的词
kw = jieba.cut(stxt)# jieba拆分字符串
d ={}# 空字典,⽤来存关键字和关键字出现的次数
for i in kw:
if len(i)==1or i in excludes:# 去掉我们不需要的词
continue
d[i]= d.get(i,0)+1# 关键字次数加⼀
newd =sorted(d.items(), key=lambda x: x[1], reverse=True)# 按出现的次数排序
count =10# 这⾥我们取出现次数最多的前⼗个
temp =""
if len(newd)< count:# 如果关键字⼩于我们需要的关键字个数,说明就不是我们想要的数据,就结束,放弃储存return0
for i in newd:
temp += i[0]# 将关键字加到我们返回的temp中
if count ==0:
break
temp +="、"# 关键字之间⽤"、"分割
count -=1
return temp
第三步:将得到的数据保存在excel中
导⼊库:
import xlwt # 进⾏excel操作
代码:
def saveData(data, savepath):
if ists(savepath):
print("保存数据到excel")
book = xlwt.Workbook(encoding="utf-8")# 初始化⼀个excel对象,编码格式为utf-8
sheet = book.add_sheet("知乎评论内容", cell_overwrite_ok=True)# 向对象中添加⼀张sheet,更新是覆盖以前单元的数据
col =("点赞数","关键字","内容")
for i in range(0,3):
sheet.write(0, i, col[i])# 先写⼊⼀⾏标题
for i in range(len(data)):
for j in range(len(data[i])):
sheet.write(i+1, j, data[i][j])# 依次每个位置写⼊数据
book.save(savepath)# 保存excel
第四步:保存在数据库中
加拿大渥太华邮编导⼊库:
import sqlite3 # 进⾏SQLITE数据库操作
代码:
#保存数据到数据库
def saveDataDB(data, savepathdb):
if ists(savepathdb):
init_db(savepathdb)# 创建数据库和数据表
print("保存数据到数据库")
conn = t(savepathdb)# 连接到数据库
cur = conn.cursor()# 获取数据库游标
for d in data:
d[2]= d[2].replace("'","''")# 将数据中的⼀个单引号变为两个单引号,SQLITE数据库的单引号转义⽅式for i in range(len(d)):
d[i]="'"+d[i]+"'"# 给每个数据两边加上单引号,⽅便执⾏sql语句插⼊
sql ='''
insert into python(
agree,keyword,content)
values(%s)'''%",".join(d)# 插⼊数据,使⽤","将d链表⾥⾯的数据链接起来
connmit()# 如果不执⾏这个语句,数据的增加修改不会真的提交到数据库
cur.close()# 关闭游标
conn.close()# 关闭连接
创建数据库:
#创建数据库
def init_db(savepathdb):
sql ='''
create table python
(
id integer primary key autoincrement,
agree numeric ,
keyword text,
content text
)
;
'''# 创建表的sql语句
conn = t(savepathdb)# 连接数据库,如果数据库不存在则创建⼀个数据库
cursor = conn.cursor()
connmit()
conn.close()
第五步:主函数调⽤
def main():
baseurl ="www.zhihu/question/27621722"# ⽹页url
headers ={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" }# 添加headers头,爬取图⽚的时候使⽤
data = getData(baseurl, headers)# 得到数据
savepath ="有趣的python.xls"# excel路径
savepathdb ="python.db"# 数据库路径
saveData(data, savepath)# 保存数据到excel表
saveDataDB(data, savepathdb)# 保存数据到数据库
print("爬取成功")
数据的爬取与存储就搞定了
excel:
数据库:
接下来我们做了⼀点数据的可视化:使⽤flask框架第⼀步:创建主页
导⼊库
from flask import Flask, render_template, request import sqlite3
主要代码:
发布评论