经过前面几篇文章的铺垫,现在我们终于可以来获取自己想要的信息了,获取豆瓣电影Top250的电影链接,电影图片链接,电影名称,评分等等信息。
完整代码
# -*- coding = utf-8 -*-
# @Time : 2021-02-10 17:32
# @Author : 穆永恒
# @File : spider_1.py
# @Software: PyCharm
# 导入所用到的包
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)
# 3.保存数据
savepath = "豆瓣电影Top250.xls"
saveData(datalist, savepath)
# 创建想要提取内容的正则表达式(非常重要)
# 影片链接
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象(规则)
# 图片
findImgSrc = re.compile(r'<img.*src="(.*?)"')
# 片名
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>')
# 爬取网页
def getData(baseurl):
datalist = []
for i in range(0, 10):
n = str(i*25) # 页数
url = baseurl + n # 每一页的网址
html = askURL(url) # 访问每一个网页的内容
# 逐一解析数据
soup = BeautifulSoup(html, "html.parser")
# 找到所要信息所在的网页中的位置
for item in soup.find_all('div', class_="item"):
# print(item)
data = [] # 保存一部电影的全部信息
item = str(item)
# 获取到影片的超链接
link = re.findall(findLink, item)[0] # 获取电影链接
data.append(link) # 添加电影链接
imgSrc = re.findall(findImgSrc, item)[0] # 获取图片链接
data.append(imgSrc)
title = re.findall(findTitle, item) # 获取电影名称
if(len(title) == 2): # 区分中文名称和外文名称
data.append(title[0])
otitle = title[1].replace("/", "")
data.append(otitle)
else:
data.append(title[0])
data.append(' ') # 如果没有外文名称则用空格占位,防止混乱
rating = re.findall(findRating, item)[0] # 获取评分
data.append(rating)
judge = re.findall(findJudge, item)[0] # 获取评价人数
data.append(judge)
datalist.append(data) # 将一步电影的所有爬取信息存入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/88.0.4324.150 Safari/537.36"}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
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):
workbook = xlwt.Workbook(encoding="utf-8") # 创建workbook对象
worksheet = workbook.add_sheet('sheet1') # 创建工作表
# 创建列名
col = ("影片链接", "图片链接", "影片中文名称", "影片外文名称", "影片评分", "评价人数")
for i in range(0, 6): # 写入列名
worksheet.write(0, i, col[i]) # 列名
for i in range(0, 250): # 写入电影信息
print("第%d行" % i+1)
data = datalist[i]
for j in range(0, 6):
worksheet.write(i+1, j, data[j])
# 保存文件
workbook.save(savepath)
if __name__ == "__main__":
# 调用函数
main()
print("爬取完毕!")
以上就是爬取一个网页的完整代码,当然都是最基本的内容,以后如果想用的话,可以直接利用这个模板进行拓展,爬取到更多我们想要的数据,当然后面的课程还有将数据存入数据库和可视化的一些内容,后续再慢慢学习吧!
Keep Moving! Keep Learning!
大家一起加油!