python 爬虫及数据可视化展示
学了有关python爬虫及数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。
1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的定位,虽然计划永远赶不上变化,但是按计划走,见招拆招或许也是不错的选择。
2、本项目是爬取豆瓣的250部电影,将电影名,电影链接,评分等信息爬取保存到本地。将相关信息以列表的形式展示在网页上,访问者可通我的网站直接挑转到豆瓣查看电影,将评分制作评分走势图,将电影制作成词云图在网页上展示,共有五个网页,可相互跳转。
项目流程图:
数据爬取:
# -*- codeing = utf-8 -*-
# @Time : 2022/1/11 22:39
# @Author : lj
# @File : spider.PY
# @Software: 4{PRODUCT_NAME}
import bs4 # 网页解析,获取数据 对网页的数据进行拆分
import re #正则表达式,进行文字匹配 对数据进行提炼
import urllib.request,urllib.error #指定url 获取网页数据 怕网页
import xlwt #进行excel 操作 存再excel中
import sqlite3 #进行sqllite 数据库操作 存在数据库中
import time
# 主函数
def main():
# 调用函数
url = "https://movie.douban.com/top250?start="
datalist1 = allData(url)
# savepath = "豆瓣电影top250.xls"
# savedata(datalist1,savepath)
dbpath = "move.db"
savedatasql(datalist1,dbpath)
#匹配所需内容的正则表达式
linkpattern = re.compile(r'<a href="https://blog.csdn.net/m0_54861649/article/details/(.*?)/">')
#匹配图片的正则表达式
imagepattern = re.compile(r'<img .*src="https://blog.csdn.net/m0_54861649/article/details/.*"/>',re.S)#re.S 忽略换行符,.表示除了换行符以外的所有字符
#匹配影名的正则表达式
namepattern = re.compile(r'<span class="title">(.*)</span>')
# 影片评分
gradepattern = re.compile(r'<span property="v:average">(.*)</span>')
# 评价人数
peoplepattern = re.compile(r'<span>(d*)人评价</span>')#(d*) 零个或多个
#概况
thinkpattern = re.compile(r'<span class="inq">(.*)</span>')
#影片的相关内容
contentpattern = re.compile(r'<p class="">(.*?)</p>',re.S)#忽略换行符
#1、爬取一个网页
def getData(url1):
head = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"}
request = urllib.request.Request(url1,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html #返回给调用的地方
# 2、爬取所有网页,匹配分析
def allData(url):
datalist = []
for i in range(0, 10): # 左闭右开 调用十次,每次二十五条信息
url1 = url + str(i * 25)
html = getData(url1) #保存获取到的网页源码
time.sleep(1)
# 逐页解析
soup = bs4.BeautifulSoup(html,"html.parser") #返回树型结构
for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,返回列表,class加下划线
data = []
item = str(item)
#link 获取到影片的超链接
link = re.findall(linkpattern,item)[0]
data.append(link)
# 影片图片
image = re.findall(imagepattern,item)[0]
data.append(image)
# 影片名
name = re.findall(namepattern,item)
if(len(name)==2):
chinaname = name[0]
data.append(chinaname)
outername = name[1].replace("/","")#.replace("/","") 列表内置的方法,将/替换为空""
data.append(outername)
else:
data.append(name[0])
data.append(' ')#外文名空出来
# 影片评分
grade = re.findall(gradepattern,item)[0]
data.append(grade)
# 影片评价人数
people = re.findall(peoplepattern, item)[0]
data.append(people)
# 影片概况
think = re.findall(thinkpattern, item)
if len(think) != 0:
think = think[0].replace("。","")
data.append(think)
else:
data.append(" ")
# 影片内容
content = re.findall(contentpattern, item)[0]
content = re.sub('<br(s+)?/>(s+)?'," ",content)#替换内容中多余的符号和内容
content = re.sub('/'," ",content)
data.append(content.strip())#去除列表中的空格
datalist.append(data)
return datalist
#3、保存数据到excel
# def savedata(datalist1,savepath):
# workplace = xlwt.Workbook(encoding="utf-8",style_compression=0)#style_compression=0·压缩样式
# worksheet = workplace.add_sheet("豆瓣电影top250",cell_overwrite_ok="true")#cell_overwrite_ok=true 是否可以覆盖
# col = ('电影详情链接','电影图片链接','影片中文名','影片外文名','评分','评价人数','概况','影片内容')
# for i in range(0,8):
# worksheet.write(0,i,col[i])
# for i in range(0,250):
# print("打印了%d条" %(i+1))
# databuffer = datalist1[i]
# for j in range(