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) #把处理好的一部电影信息放入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(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:
- continue
- data[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:
- continue
- data[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("爬取完毕")