python豆瓣Top250数据分析
python基础学习
Python基础语法_aiqq136的博客-CSDN博客
python_webcrawler
以下内容
数据可视化
数据可视化_aiqq136的博客-CSDN博客
一.python爬虫
1.任务介绍
需求分析
爬取豆瓣电影Top250的基本信息,包括电影的名称、豆瓣评分、评价数、电影概况、电影链接等。
https://movie.douban.com/top250
2.爬虫初识
什么是爬虫?
网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。
由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略。
爬虫可以做什么?
你可以爬取妹子的图片,爬取自己想看的视频等等,只要你能通过浏览器访问的数据都可以通过爬虫获取。
爬虫的本质是什么?
模拟浏览器打开网页,获取网页中我们想要的那部分数据。
3.基本流程
准备工作
通过浏览器查看分析目标网页,学习编程基础规范。
获取数据
通过HTTP库向目标站点发起请求,请求可以包含额外的header等信息,
如果服务器能正常响应,会得到一个Response,便是所要获取的页面内容。
解析内容
得到的内容可能是HTML、json等格式,可以用页面解析库、正则表达式等进行解析。
保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件。
二.准备工作
1.网页的路径规律
https://movie.douban.com/top250?start=0 从第1个开始展示
https://movie.douban.com/top250?start=25 从第26个开始展示
2.URL分析
页面包括250条电影数据,分10页,每页25条
每页的URL的不同之处:最后的数值=(页数- 1)* 25
3.分析页面
借助Chrome开发者工具(F12)来分析网页,在Elements下找到需要的数据位置
Select an element in the page to inspect it Ctrl + Shift +C
在network下可以看刷新网址以后的所有访问请求的时间线
Headers:当前这一次访问给浏览器发送的信息
User-Agent:浏览器信息
需要登录的网页 要用到cookie
4.编码规范
1.一般Python程序第一行需要加入
#-*- coding: utf-8 -*-或者# coding=utf-8
这样可以在代码中包含中文
2.在Python中,使用函数实现单一功能或相关联功能的代码段,可以提高可读性和代码重复利用率,
函数代码块以def关键词开头,后接空格、函数标识符名称、圆括号()、冒号:
括号中可以传入参数,函数段缩进(Tab或四个空格,只能任选一种),
return用于结束函数,可以返回一个值,也可以不带任何表达式(表示返回None )
3.Python文件中可以加入main函数用于测试程序
if __name__ == "__main__":
有利于管理函数的执行顺序
例子:
#-*- coding: utf-8 -*-
def main():print("hello")if __name__ == "__main__": #当程序执行时#调用函数main()
4.Python使用#添加注释,说明代码(段)的作用
三.引入模块
1.模块( module )
用来从逻辑上组织Python代码(变量、函数、类),本质就是py文件,提高代码的可维护性。
Python使用import来导入模块,如import sys
例子:
test1文件夹里面有t1.py
def add(a,b):return a+b
而我想在test2文件夹的t2.py中调用t1中的函数
#引入自定义的模块
from test1 import t1
print(t1.add(2,3))
#引入系统的模块
import sys
import os
#引入第三方模块(这些都是这个项目要使用的模块)
import bs4 #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作
由于我使用的工具为vs2019,它的第三方模块的加载方式为
在这里输入想查找的包的名字,例如bs4
点击pip install bs4就可以了
现在程序为
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作def main():baseurl="https://movie.douban.com/top250"#1.爬取网页datalist=getData(baseurl)savepath=".\\豆瓣电影Top250.xls" #当前文件夹下#3.保存数据saveData(savepath)#爬取网页
def getData(baseurl):datelist=[]#2.逐一解析数据return datalist#保存数据
def saveData(savepath):print("save.....")if __name__ == "__main__": #当程序执行时#调用函数main()
2.获取数据
Python一般使用urllib库获取页面
获取页面数据
- 对每一个页面,调用askURL函数获取页面内容
- 定义一个获取页面的函数askURL,传入一个url参数,表示网址,如https:// movie.douban.com/top250?start=0
- urllib.Request生成请求:urllib.urlopen发送请求获取响应; rcad获取页面内容
- 在访问页面时经常会出现错误,为了程序正常运行,加入异常捕获try…except…语句
urllib测试
urllib测试_aiqq136的博客-CSDN博客
获取数据
得到一个指定URL的网页内容
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作def main():baseurl="https://movie.douban.com/top250?start="#1.爬取网页datalist=getData(baseurl)savepath=".\\豆瓣电影Top250.xls" #当前文件夹下#3.保存数据#saveData(savepath)askURL("https://movie.douban.com/top250?start=")#爬取网页
def getData(baseurl):datalist=[]#2.逐一解析数据return datalist#得到一个指定URL的网页内容
def askURL(url):#模拟浏览器头部信息,向豆瓣服务器发送信息head={"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}#用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是高速浏览器,我们可以接受什么水平的信息)request=urllib.request.Request(url,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#保存数据
def saveData(savepath):print("save.....")if __name__ == "__main__": #当程序执行时#调用函数main()
查看内容,发现得到网页的数据了
爬取网页
用循环构造换页
#爬取网页
def getData(baseurl):datalist=[]for i in range(0,10): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据return datalist
现阶段代码
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作def main():baseurl="https://movie.douban.com/top250?start="#1.爬取网页datalist=getData(baseurl)savepath=".\\豆瓣电影Top250.xls" #当前文件夹下#3.保存数据#saveData(savepath)askURL("https://movie.douban.com/top250?start=")#爬取网页
def getData(baseurl):datalist=[]for i in range(0,10): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据return datalist#得到一个指定URL的网页内容
def askURL(url):#模拟浏览器头部信息,向豆瓣服务器发送信息head={"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}#用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是高速浏览器,我们可以接受什么水平的信息)request=urllib.request.Request(url,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#保存数据
def saveData(savepath):print("save.....")if __name__ == "__main__": #当程序执行时#调用函数main()
补充BeautifulSoup用于html文件解析
BeautifulSoup用于html文件解析_aiqq136的博客-CSDN博客
补充re模块:正则表达式
re模块:正则表达式_aiqq136的博客-CSDN博客
正则提取
拿到每一个电影的相关信息
#2.逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表print(item)
搞出第一页影片的超链接
#影片详情的链接的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串模式)#爬取网页
def getData(baseurl):datalist=[]for i in range(0,1): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表#print(item) #测试:查看电影item全部信息data=[] #保存一部电影的全部信息item=str(item)#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串,[0]表示如果有两个,只要第一个print(link)return datalist
https://movie.douban.com/subject/1292052/
https://movie.douban.com/subject/1291546/
。。。。。。。。
https://movie.douban.com/subject/1291560/
https://movie.douban.com/subject/3319755/
截断整出一个电影的item信息,把需求的东西都提取出来,之后加循环就行了
#爬取网页
def getData(baseurl):datalist=[]for i in range(0,1): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表#print(item) #测试:查看电影item全部信息data=[] #保存一部电影的全部信息item=str(item)print(item)break#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串,[0]表示如果有两个,只要第一个print(link)return datalist
保存到一个html文档里面进行对比
<div class="item"> <div class="pic"> <em class="">1</em> <a href="https://movie.douban.com/subject/1292052/"> <img alt="肖申克的救赎" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/> </a> </div> <div class="info"> <div class="hd"> <a class="" href="https://movie.douban.com/subject/1292052/"> <span class="title">肖申克的救赎</span> <span class="title"> / The Shawshank Redemption</span> <span class="other"> / 月黑高飞(港) / 刺激1995(台)</span> </a> <span class="playable">[可播放]</span> </div> <div class="bd"> <p class="">导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br/>1994 / 美国 / 犯罪 剧情</p> <div class="star"> <span class="rating5-t"></span> <span class="rating_num" property="v:average">9.7</span> <span content="10.0" property="v:best"></span> <span>2523850人评价</span> </div> <p class="quote"> <span class="inq">希望让人自由。</span> </p> </div> </div> </div>
将相关需要提取的东西转为正则表达式,并设置为全局变量
#影片详情的链接的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串模式)
#影片图片
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片评分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到评价人数
findJudge=re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#找到影片的相关内容
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)
把电影的相关信息保存到datalist里面
#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串,[0]表示如果有两个,只要第一个data.append(link) #列表添加链接imgSrc=re.findall(findImgSrc,item)[0]data.append(imgSrc) #列表添加图片titles=re.findall(findTitle,item) #片名可能只有一个中文名,没有外文名if(len(titles)==2):ctitle=titles[0] #添加中文名data.append(ctitle)otitle=titles[1].replace("/","") #去掉无关的符号data.append(otitle) #添加外国名else:data.append(titles[0])data.append(' ') #外国名留空rating=re.findall(findRating,item)[0]data.append(rating) #添加评分judgeNum=re.findall(findJudge,item)[0]data.append(judgeNum) #添加评价人数inq=re.findall(findInq,item)[0]if len(inq)!=0:inq=inq[0].replace("。","") #去掉句号data.append(inq) #添加概述else:data.append(" ") #留空bd=re.findall(findBd,item)bd=re.sub('<br(\s+)?/>(\s+)?'," ",bd) #去掉<br/>bd=re.sub('/'," ",bd) #去掉/data.append(bd.strip()) #去掉前后的空格datalist.append(data) #把处理好的一部电影信息放入datalist
全代码
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作def main():baseurl="https://movie.douban.com/top250?start="#1.爬取网页datalist=getData(baseurl)savepath=".\\豆瓣电影Top250.xls" #当前文件夹下#3.保存数据#saveData(savepath)askURL("https://movie.douban.com/top250?start=")#影片详情的链接的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串模式)
#影片图片
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片评分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到评价人数
findJudge=re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#找到影片的相关内容
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)#爬取网页
def getData(baseurl):datalist=[]for i in range(0,1): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表#print(item) #测试:查看电影item全部信息data=[] #保存一部电影的全部信息item=str(item)#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串,[0]表示如果有两个,只要第一个data.append(link) #列表添加链接imgSrc=re.findall(findImgSrc,item)[0]data.append(imgSrc) #列表添加图片titles=re.findall(findTitle,item) #片名可能只有一个中文名,没有外文名if(len(titles)==2):ctitle=titles[0] #添加中文名data.append(ctitle)otitle=titles[1].replace("/","") #去掉无关的符号data.append(otitle) #添加外国名else:data.append(titles[0])data.append(' ') #外国名留空rating=re.findall(findRating,item)[0]data.append(rating) #添加评分judgeNum=re.findall(findJudge,item)[0]data.append(judgeNum) #添加评价人数inq=re.findall(findInq,item)if len(inq)!=0:inq=inq[0].replace("。","") #去掉句号data.append(inq) #添加概述else:data.append(" ") #留空bd=re.findall(findBd,item)[0]bd=re.sub('<br(\s+)?/>(\s+)?'," ",bd) #去掉<br/>bd=re.sub('/'," ",bd) #去掉/data.append(bd.strip()) #去掉前后的空格datalist.append(data) #把处理好的一部电影信息放入datalistprint (datalist)return datalist#得到一个指定URL的网页内容
def askURL(url):#模拟浏览器头部信息,向豆瓣服务器发送信息head={"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}#用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是高速浏览器,我们可以接受什么水平的信息)request=urllib.request.Request(url,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#保存数据
def saveData(savepath):print("save.....")if __name__ == "__main__": #当程序执行时#调用函数main()
3.4保存数据
3.4.1Excel表存储
利用python库xlwt将抽取的数据datalist写入Excel表格
- 以utf-8编码创建一个Excel对象
- 创建一个Sheet表
- 往单元格写入内容
- 保存表格
用几行python代码写入xls表格
import xlwt
workbook=xlwt.Workbook(encoding="utf-8") #创建workbook对象
worksheet=workbook.add_sheet('sheet1') #创建工作表
worksheet.write(0,0,'hello') #写入数据,第一个参数表示行,第二个参数表示列,第三个参数内容
workbook.save('student.xls') #保存文件
例子:在xls表格写入99乘法表
import xlwt
workbook=xlwt.Workbook(encoding="utf-8") #创建workbook对象
worksheet=workbook.add_sheet('sheet1') #创建工作表for i in range(1,10): #行for j in range(1,i+1): #列worksheet.write(i-1,j-1,"%d * %d = %d"%(i,j,i*j))
workbook.save('99.xls') #保存文件
保存数据:Top250
#保存数据
def saveData(datalist,savepath):print("save.....")book=xlwt.Workbook(encoding="utf-8",style_compression=0) #样式压缩效果sheet=book.add_sheet('豆瓣电影TOP250',cell_overwrite_ok=True) #单元格可以覆盖col=("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") #元组for i in range(0,8):sheet.write(0,i,col[i])for i in range(0,250):print("第%d条"%i)data=datalist[i]for j in range(0,8):sheet.write(i+1,j,data[j]) #数据book.save('doubanTop250.xls') #保存
Message=list index out of range 错误
将inq=re.findall(findInq,item)[0]
改为inq=re.findall(findInq,item)
xls表格保存豆瓣Top250的全代码
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作def main():baseurl="https://movie.douban.com/top250?start="#1.爬取网页datalist=getData(baseurl)savepath=".\\豆瓣电影Top250.xls" #当前文件夹下#3.保存数据saveData(datalist,savepath)askURL("https://movie.douban.com/top250?start=")#影片详情的链接的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串模式)
#影片图片
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片评分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到评价人数
findJudge=re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#找到影片的相关内容
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)#爬取网页
def getData(baseurl):datalist=[]for i in range(0,10): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表#print(item) #测试:查看电影item全部信息data=[] #保存一部电影的全部信息item=str(item)#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串,[0]表示如果有两个,只要第一个data.append(link) #列表添加链接imgSrc=re.findall(findImgSrc,item)[0]data.append(imgSrc) #列表添加图片titles=re.findall(findTitle,item) #片名可能只有一个中文名,没有外文名if(len(titles)==2):ctitle=titles[0] #添加中文名data.append(ctitle)otitle=titles[1].replace("/","") #去掉无关的符号data.append(otitle) #添加外国名else:data.append(titles[0])data.append(' ') #外国名留空rating=re.findall(findRating,item)[0]data.append(rating) #添加评分judgeNum=re.findall(findJudge,item)[0]data.append(judgeNum) #添加评价人数inq=re.findall(findInq,item)if len(inq)!=0:inq=inq[0].replace("。","") #去掉句号data.append(inq) #添加概述else:data.append(" ") #留空bd=re.findall(findBd,item)[0]bd=re.sub('<br(\s+)?/>(\s+)?'," ",bd) #去掉<br/>bd=re.sub('/'," ",bd) #去掉/data.append(bd.strip()) #去掉前后的空格datalist.append(data) #把处理好的一部电影信息放入datalist#print (datalist)return datalist#得到一个指定URL的网页内容
def askURL(url):#模拟浏览器头部信息,向豆瓣服务器发送信息head={"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}#用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是高速浏览器,我们可以接受什么水平的信息)request=urllib.request.Request(url,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#保存数据
def saveData(datalist,savepath):print("save.....")book=xlwt.Workbook(encoding="utf-8",style_compression=0) #样式压缩效果sheet=book.add_sheet('豆瓣电影TOP250',cell_overwrite_ok=True) #单元格可以覆盖col=("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") #元组for i in range(0,8):sheet.write(0,i,col[i])for i in range(0,250):print("第%d条"%i)data=datalist[i]for j in range(0,8):sheet.write(i+1,j,data[j]) #数据book.save('doubanTop250.xls') #保存if __name__ == "__main__": #当程序执行时#调用函数main()print("爬去完毕")
补充SQLite相关知识
SQLite相关知识_aiqq136的博客-CSDN博客sqlite是python3后支持的简单数据库打开或创建数据库import sqlite3conn=sqlite3.connect("test.db") #打开或创建数据库print("Opened database successfully")pycharm通过database查看SQLite数据库SQLite建表格式import sqlite3conn=sqlite3.connect("test.db") #打开或创建数据库prin..https://blog.csdn.net/aiqq136/article/details/122478368
保存数据到SQLite
主函数修改
def main():baseurl="https://movie.douban.com/top250?start="#1.爬取网页datalist=getData(baseurl)#savepath=".\\豆瓣电影Top250.xls" #当前文件夹下dbpath="movie.db"#3.保存数据#saveData(datalist,savepath)saveData2DB(datalist,dbpath)#askURL("https://movie.douban.com/top250?start=")
数据库保存数据
#数据库保存数据
def saveData2DB(datalist,dbpath):print("...")
创建数据库
#创建数据库
def init_db(dbpath):sql='''create table movie250(id integer primary key autoincrement,info_link text,pic_link text,cname varchar,ename varchar,score numeric,rated numeric,instroduction text,info text)''' #创建数据表conn=sqlite3.connect(dbpath)cursor=conn.cursor()cursor.execute(sql)conn.commit()conn.close()if __name__ == "__main__": #当程序执行时#调用函数#main()init_db("movietest.db")print("爬取完毕")
数据库保存数据
#数据库保存数据
def saveData2DB(datalist,dbpath):print("saving....")init_db(dbpath)conn=sqlite3.connect(dbpath) #链接数据库cur=conn.cursor() #游标#print(datalist)for data in datalist:for index in range(len(data)):if index==4 or index==5:continuedata[index]='"'+data[index]+'"'sql='''insert into movie250(info_link,pic_link,cname,ename,score,rated,instroduction,info)values(%s)'''%",".join(data)print(sql)#cur.execute(sql)#conn.commit()cur.close()conn.close()print("save done....")
全代码
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网络数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作def main():baseurl="https://movie.douban.com/top250?start="#1.爬取网页datalist=getData(baseurl)#savepath=".\\豆瓣电影Top250.xls" #当前文件夹下dbpath="movie.db"#3.保存数据#saveData(datalist,savepath)saveData2DB(datalist,dbpath)#askURL("https://movie.douban.com/top250?start=")#影片详情的链接的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串模式)
#影片图片
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片评分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到评价人数
findJudge=re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#找到影片的相关内容
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)#爬取网页
def getData(baseurl):datalist=[]for i in range(0,10): #调用获取页面信息的函数,10次url=baseurl + str(i*25)html=askURL(url) #保存获取到的网页源码#2.逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表#print(item) #测试:查看电影item全部信息data=[] #保存一部电影的全部信息item=str(item)#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串,[0]表示如果有两个,只要第一个data.append(link) #列表添加链接imgSrc=re.findall(findImgSrc,item)[0]data.append(imgSrc) #列表添加图片titles=re.findall(findTitle,item) #片名可能只有一个中文名,没有外文名if(len(titles)==2):ctitle=titles[0] #添加中文名data.append(ctitle)otitle=titles[1].replace("/","") #去掉无关的符号data.append(otitle) #添加外国名else:data.append(titles[0])data.append(' ') #外国名留空rating=re.findall(findRating,item)[0]data.append(rating) #添加评分judgeNum=re.findall(findJudge,item)[0]data.append(judgeNum) #添加评价人数inq=re.findall(findInq,item)if len(inq)!=0:inq=inq[0].replace("。","") #去掉句号data.append(inq) #添加概述else:data.append(" ") #留空bd=re.findall(findBd,item)[0]bd=re.sub('<br(\s+)?/>(\s+)?'," ",bd) #去掉<br/>bd=re.sub('/'," ",bd) #去掉/data.append(bd.strip()) #去掉前后的空格datalist.append(data) #把处理好的一部电影信息放入datalist#print (datalist)return datalist#得到一个指定URL的网页内容
def askURL(url):#模拟浏览器头部信息,向豆瓣服务器发送信息head={"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}#用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是高速浏览器,我们可以接受什么水平的信息)request=urllib.request.Request(url,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#保存数据
def saveData(datalist,savepath):print("save.....")book=xlwt.Workbook(encoding="utf-8",style_compression=0) #样式压缩效果sheet=book.add_sheet('豆瓣电影TOP250',cell_overwrite_ok=True) #单元格可以覆盖col=("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息") #元组for i in range(0,8):sheet.write(0,i,col[i])for i in range(0,250):print("第%d条"%i)data=datalist[i]for j in range(0,8):sheet.write(i+1,j,data[j]) #数据book.save('doubanTop250.xls') #保存#数据库保存数据
def saveData2DB(datalist,dbpath):print("saving....")init_db(dbpath)conn=sqlite3.connect(dbpath) #链接数据库cur=conn.cursor() #游标for data in datalist:for index in range(len(data)):if index==4 or index==5:continuedata[index]='"'+data[index]+'"'sql='''insert into movie250(info_link,pic_link,cname,ename,score,rated,instroduction,info)values(%s)'''%",".join(data)#print(sql)cur.execute(sql)conn.commit()cur.close()conn.close()print("save done....")#创建数据库
def init_db(dbpath):sql='''create table movie250(id integer primary key autoincrement,info_link text,pic_link text,cname varchar,ename varchar,score numeric,rated numeric,instroduction text,info text)''' #创建数据表conn=sqlite3.connect(dbpath)cursor=conn.cursor()cursor.execute(sql)conn.commit()conn.close()if __name__ == "__main__": #当程序执行时#调用函数main()print("爬取完毕")
爬取成功并存到数据库中
python豆瓣Top250数据分析相关推荐
- ## 应用Python爬虫、Flask框架、Echarts、WordCloud等技术实现豆瓣Top250数据分析
1.爬取豆瓣Top250信息,例如名称,评分,评价数,概况等 https://movie.douban.com/top250 2.url分析: https://movie.douban.com/top ...
- python 豆瓣评论数据分析_Python数据可视化分析--豆瓣电影Top250
Python数据分析–豆瓣电影Top250 利用Python爬取豆瓣电影TOP250并进行数据分析,对于众多爬虫爱好者,应该并不陌生.很多人都会以此作为第一个练手的小项目.当然这也多亏了豆瓣的包容,没 ...
- python 豆瓣评论数据分析_Python爬虫实战案例:豆瓣影评大数据分析报告之网页分析...
个人希望,通过这个完整的爬虫案例(预计总共4篇短文),能够让爬虫小白学会怎么做爬虫的开发,所以在高手们看来,会有很多浅显的废话,如果觉得啰嗦,可以跳过一些内容~ 上一篇文章给大家简单介绍了Python ...
- python pandas 豆瓣电影 top250 数据分析
python pandas 豆瓣电影 top250 数据分析 豆瓣电影top250数据分析 数据来源(豆瓣电影top250) 爬虫代码比较简单 数据较为真实,可以进行初步的数据分析 可以将前面的几篇文 ...
- 数据分析与挖掘案例之使用python抓取豆瓣top250电影数据进行分析
使用python抓取豆瓣top250电影数据进行分析 抓取豆瓣Top250电影数据的链接和电影名称 代码如下: import urllib.request as urlrequest from bs4 ...
- Python 爬虫分析豆瓣 TOP250 告诉你程序员业余该看什么书?
[CSDN 编者按]程序员刷豆瓣也要刷出技术感,本文爬取豆瓣 TOP250 告诉你这些书"热门"在哪里!案例分析之外,重在梳理编写爬虫的逻辑和链路关键点,手把手教你形成自己编写爬虫 ...
- 爬虫(豆瓣电影Top250数据分析)学习笔记
学习了有关python爬虫的内容,也算有所收获,写下第一篇博客来对所学进行一个总结,也算督促自己进行主动研究学习的第一步. 主要内容: 首先总结一下学习的主要内容: 从豆瓣获取数据 建立SQLite数 ...
- [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...
- python爬虫拉取豆瓣Top250数据
python爬虫拉取豆瓣Top250数据 利用request和正则表达式抓取豆瓣电影Top250的相关内容,提取出电影的名称.时间.评分和图片等信息,提取的站点url为https://movie.do ...
- python爬虫——爬取豆瓣TOP250电影
相信很多朋友在看一部电影的时候喜欢先去豆瓣找一下网友对该片的评价.豆瓣作为国内最权威的电影评分网站,虽然有不少水军和精日精美分子,但是TOP250的电影还是不错的,值得一看. 爬取目标 本文将爬取豆瓣 ...
最新文章
- 如何创建一个百分百懂你的产品推荐系统 | 深度教程(附代码详解)
- bootstraptable设置行高度_条码打印软件中不干胶卷纸的标签设置方法
- 嵌入式培训学习历程第二十二天
- abap 添加alv上的工具栏的按钮_Excel里的置顶功能——快速访问工具栏
- sql 左联接 全联接_通过了解自我联接将您SQL技能提升到一个新的水平
- JVectorMap 实现中国地图
- android设置大小能用小数,Android中关于保留小数点位数的处理
- Linux系统下文件与目录操作讲解
- A*算法(最佳优先搜索)
- Java基础增强:集合的嵌套案例
- 【TSP】基于matlab自适应动态邻域布谷鸟混合算法求解旅行商问题【含Matlab源码 1513期】
- 使用Appium进行Android自动化测试遇到编译不成功的错误处理
- PS替换证件照背景颜色
- jQuery实现鼠标滑过图片放大效果
- Win7下安装XP(PE)
- TCP的三次握手和四次挥手
- Spring_AOP(execution表达式)
- 笔记本计算机屏幕亮度暗,笔记本屏幕暗,教您怎么解决
- 人工蜂群算法python_python如何实现人工蜂群算法 python实现人工蜂群算法代码示例...
- 爬虫抓取某饿了app商铺的评论数据