基于之前两篇的基础知识后
python爬虫学习笔记(一)——初识爬虫
python爬虫学习笔记(二)——解析内容
开始实战爬取豆瓣TOP250电影
首先还是重新复习下爬虫的基本流程:
话不多说,直接发起爬取请求
# 得到指定一个URL的网页内容
def GetHTML(url):
try:
headers = { # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
} # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
r = requests.get(url, headers=headers, timeout=30)
r.raise_for_status # 若状态码不是200,抛出HTTPError异常
r.encoding = r.apparent_encoding # 保证页面编码正确
except requests.exceptions.ConnectTimeout:
print('爬虫超时!')
except requests.exceptions.ConnectionError:
print('无效地址!')
return r.text
然而,我们发现一页只有25部电影信息,爬取Top250部一共需要10页
当链接为https://movie.douban.com/top250?start=25时,我们可以发现此时正是电影的第二页,按照这个规律,利用一个for循环,我们就可以提取10页的网页数据了
for i in range(0, 10): # 调用获取页面信息的函数,10次
url = baseurl + str(i * 25)
response = GetHTML(url)
获取完一堆网页数据后,此时就需要一步步解析出我们所需要的信息
按下F12,找出第一部电影的相关信息的对应关系
然后通过正则表达式查找指定的字符串
# 获取影片排名
findrank = re.compile(r'(.*)')
# 获取影片名字的
findTitle = re.compile(r'(.*)')
# 获取影片评分的
findRating = re.compile(r' ')
# 获取影片评价人数的
findJudge = re.compile(r'(\d*)人评价')
# 获取影片概况的
findInq = re.compile(r'(.*)')
# 获取影片相关内容的
findBd = re.compile(r'(.*?)
',re.S)
# 获取详情的链接的
findLink = re.compile(r'')
# 获取影片图片链接
findImgSrc = re.compile(r',re.S)
当学会第一部影片信息的提取后,此时便可举一反二五零
# 逐一解析数据
def SoupHTML(url):
datalist = []
for i in range(0, 10): # 调用获取页面信息的函数,10次
url = baseurl + str(i * 25)
response = GetHTML(url) # 保存获取到的网页源码
Soup = BeautifulSoup(response, "html.parser")
for item in Soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表
data = [] # 保存一部电影的所有信息
item = str(item)
# 影片排名的解析
findrank = re.compile(r'(.*)')
rank = re.findall(findrank, item)[0]
data.append(rank) # 添加排名
# 影片名字的解析
findtitle = re.compile(r'(.*)')
title = re.findall(findtitle, item)
if len(title) == 2:
ctitle = title[0]
data.append(ctitle) # 添加中文名
otitle = title[1].replace("/", "")
data.append(otitle) # 添加外国名
else:
data.append(title[0])
data.append(" ") # 若无外国名字,则留空
# 影片评分的解析
findrating = re.compile(r' ')
rating = re.findall(findrating, item)[0]
data.append(rating) # 添加评分
# 影片评价人数的解析
findjudge = re.compile(r'(\d*)人评价')
judgenum = re.findall(findjudge, item)[0]
data.append(judgenum) # 添加评价人数
# 影片概况的解析
findinq = re.compile(r'(.*)')
inq = re.findall(findinq, item)
if len(inq) != 0:
inq = inq[0].replace("。", "")
data.append(inq) # 添加概述
else:
data.append(" ")
# 影片相关内容的解析
findbd = re.compile(r'(.*?)
', re.S)
bd = re.findall(findbd, item)[0]
bd = re.sub('
(\s+)?', " ", bd)
bd = re.sub('/', " ", bd)
data.append(bd.strip()) # 添加相关内容
# 影片详情的链接的解析
findlink = re.compile(r'')
link = re.findall(findlink, item)[0]
data.append(link) # 添加链接
# 影片图片链接的解析
findimgsrc = re.compile(r', re.S)
imgsrc = re.findall(findimgsrc, item)[0]
data.append(imgsrc) # 添加图片链接
datalist.append(data) # 把解析好的一部电影信息放入datalist
return datalist
由于250部电影的数据比较庞大,直接print出来可能会显示不完整
于是我们选择保存到excel表格中便于观察和研究
首先我们需要了解一下Python-xlwt库的基本使用
然后就可以上手保存数据
def SaveHTML(datalist):
print("Start saving……")
book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象
sheet = book.add_sheet("电影TOP250", cell_overwrite_ok=True) # 创建工作表
col = ("排名","影片中文名", "影片外国名", "评分", "评价人数", "影片概述", "影片相关内容", "影片链接", "影片图片链接")
for i in range(0, 9):
sheet.write(0, i, col[i]) # 列名
for i in range(0, 250):
print("第%d条" % (i + 1))
data = datalist[i]
for j in range(0, 9):
sheet.write(i + 1, j, data[j]) # 写入数据
book.save("豆瓣电影TOP_250.xls")
print("数据保存成功!")
最后的最后,稍稍调用一下上面的3个函数
if __name__ == "__main__":
url = "https://movie.douban.com/top250?start="
Datalist = SoupHTML(url)
SaveHTML(Datalist)
最后实战成果如图: