目录
前言
版本及库
实战
以下代码展示的是思路
引入库
网页请求
封装头部信息
爬取网页
定义规则
保存数据
全部代码
我看了其他前辈的一些爬取豆瓣的教程最早也在几个月以前的了,正好最近在B站学了爬取豆瓣,出于记录的目的吧,就写上一篇blog分享一下,如果效果好的话,我分享一些我学到的数据保存到数据库、做一个小网站,在网站上实现数据可视化。
解释器是python3.9,用的pycharm来做得,如果想保存数据到数据库好像需要专业版的pycharm吧。反正我用社区版没找到。
库使用到了re,urllib, bs4 ,xlwt这四个,如果有安装库啥的问题欢迎评论讨论。
在前奏工作准备好以后,就可以开始操作了。
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
要的到网页信息我们需要封装一个头部信息,也就是模拟浏览器向服务器获取网页的请求。
在豆瓣网页:豆瓣电影 Top 250,按F12,再向下图把最长红框哪里复制下来。
注意,头部信息是字典,记住加引号,有些同学复制下来的User-Agent中间会有多余的空格,有可能会导致请求失败,注意删除。
def getUrl(url):
head ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
res = urllib.request.Request(url=url,headers=head) #封装头部信息
html=""
try: #这里的try,是为了检测一些错误,例如我就遇到了418,403等
response = urllib.request.urlopen(res) #向浏览器发出请求
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reson"):
print(e.reason)
#print(html)
return html
其中通过re库:movie_link =re.findall(Movie_links,item)[0],Movie_links是一种规则,item是在前面规则下需要从item中提取出来的信息,规则是自己定义的。
def getdata(burl):
datalist = []
for i in range(0,10):
url = burl + str(i*25) #因为是需要爬取250部电影,而每个网页只有250部电影,大家可以去看看豆瓣从第一页到第25页的URL的规则,这里就懂了
html = getUrl(url) ##保存获取到的网页源码
soup = BeautifulSoup(html,"html.parser") #使用bs4进行解析
for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表,可以按F12查看一下每个电影信息在哪个标签里面
#print(item)
data = []
item = str(item)
#保存电影链接
movie_link =re.findall(Movie_links,item)[0]
data.append(movie_link)
#保存网页链接
picture_links = re.findall(Picture_links,item)
data.append(picture_links)
#保存电影名字,电影有中国名和其他名字,有些特殊情况没有外国名
name = re.findall(Name,item)
if len(name)==2:
cname = name[0] #cname中国名,oname其他名字
data.append(cname)
oname = name[1].replace("/","")
oname = oname.replace("\xa0", "")
data.append(oname)
else:
data.append(name[0])
data.append(" ")
#添加评分
ratings = re.findall(Ratings,item)
data.append(ratings)
#添加评价人数
umber_of_people = re.findall(Umber_of_people,item)
data.append(umber_of_people)
# 添加概述
profiles = re.findall(Profiles,item) # 添加概述
if len(profiles)!=0:
profiles[0].replace("。","") #去掉句号
data.append(profiles)
else:
data.append(" ") #留空
datalist.append(data)
return datalist
提取规则需要用到re库,re库这里就不再介绍。
#使用正则表达式来制定一些提取网页信息的规则
#提取电影链接规则
Movie_links = re.compile(r'')
#提取图片链接规则
Picture_links = re.compile(r'img.*src="(.*?)"',re.S)
#提取电影名字规则
Name = re.compile(r'(.*)')
#提取评分规则
Ratings = re.compile(r' ')
#提取评价人数规则
Umber_of_people = re.compile(r'(\d*)人评价')
#提取概况规则
Profiles = re.compile(r'(.*)')
这里就用到了xlwt这个库。这个库具体使用方法就去查重就懂了,不难的。
def savedata(datalist,savepath):
book = xlwt.Workbook(encoding='utf-8',style_compression=0) #创建workbook对象
sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True) #创建工作表
col = ["电影链接","图片链接","c电影名字","o电影名字","评分","评价人数","概况"]
for i in range(0,7):
sheet.write(0,i,col[i]) #列名
for i in range(0,250):
print("保存第 %d 条数据"%(i+1))
data = datalist[i]
for j in range(0,7):
sheet.write(i+1,j,data[j])
book.save(savepath)
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
def main():
burl = 'https://movie.douban.com/top250?start='
datalist = getdata(burl)
#print(datalist)
savepath = '豆瓣Top250.xls'
savedata(datalist,savepath)
#使用正则表达式来制定一些提取网页信息的规则
Movie_links = re.compile(r'')
Picture_links = re.compile(r'img.*src="(.*?)"',re.S)
Name = re.compile(r'(.*)')
Ratings = re.compile(r' ')
Umber_of_people = re.compile(r'(\d*)人评价')
Profiles = re.compile(r'(.*)')
def getdata(burl):
datalist = []
for i in range(0,10):
url = burl + str(i*25)
html = getUrl(url)
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):
#print(item)
data = []
item = str(item)
movie_link =re.findall(Movie_links,item)[0]
data.append(movie_link)
picture_links = re.findall(Picture_links,item)
data.append(picture_links)
name = re.findall(Name,item)
if len(name)==2:
cname = name[0]
data.append(cname)
oname = name[1].replace("/","")
oname = oname.replace("\xa0", "")
data.append(oname)
else:
data.append(name[0])
data.append(" ")
ratings = re.findall(Ratings,item)
data.append(ratings)
umber_of_people = re.findall(Umber_of_people,item)
data.append(umber_of_people)
profiles = re.findall(Profiles,item) # 添加概述
if len(profiles)!=0:
profiles[0].replace("。","") #去掉句号
data.append(profiles)
else:
data.append(" ") #留空
datalist.append(data)
return datalist
def getUrl(url):
head ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
res = urllib.request.Request(url=url,headers=head)
html=""
try:
response = urllib.request.urlopen(res)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reson"):
print(e.reason)
#print(html)
return html
def savedata(datalist,savepath):
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
col = ["电影链接","图片链接","c电影名字","o电影名字","评分","评价人数","概况"]
for i in range(0,7):
sheet.write(0,i,col[i])
for i in range(0,250):
print("保存第 %d 条数据"%(i+1))
data = datalist[i]
for j in range(0,7):
sheet.write(i+1,j,data[j])
book.save(savepath)
if __name__ == '__main__':
main()
print("爬取完毕")
一条数据代表一个电影信息
Pycharm背景图片设置