01python爬虫
❥任务:爬取豆瓣Top250 基本信息(名称、评分、评价数、电影概况、电影链接)
02完整源码
❥准备工作
❥获取数据
❥解析数据
❥保存数据
# 准备工作
# https://movie.douban.com/top250
from Crypto.SelfTest.Hash.test_SHAKE import data
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='
askURL(baseUrl)
datalist = getData(baseUrl)
savepath = ".\\豆瓣TOP250.xls"
#保存数据
saveData(datalist, savepath)
# 创建影片超链接正则表达式
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):
url = baseUrl + str(i * 25)
html = askURL(url) # 保存获取到的网页
# 逐一解析数据
soup = BeautifulSoup(html, 'html.parser') # 也可以使用lxml代替html.parser作为解析器
# print(soup.find_all('div', class_="item"))
for item in soup.find_all('div', class_="item"):
data = [] # 保存一部电影的所有信息
item = str(item) # 将列表转换为字符串
# print(item)
# break
# 获取影片超链接
link = re.findall(findLink, item)[0] #re库通过正则表达式来查找指定的字符串
data.append(link) # 添加超链接(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.split()) # 添加英文名,并将空格去掉
else:
data.append(titles[0])
data.append(" ") # 留空
# 获取影片评分
rating = re.findall(findRating, item)[0]
data.append(rating) # 添加影片评分
# 获取评价人数
judge = re.findall(findJudge, item)[0]
data.append(judge) # 添加评论人数
# 获取概况
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.split()) # 去掉前后的空格(\xa0代表空白符  使用strip()无法去掉)
# print(data)
datalist.append(data) # 将一页的电影信息添加进去
return datalist
# 获取网页链接
def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
}
req = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8') # read()获取响应体的内容,内容是bytes字节流,需要转换成字符串
# 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("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,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()
saving...
0条数据已读取
1条数据已读取
2条数据已读取
3条数据已读取
4条数据已读取
5条数据已读取
...
03保存数据到 Excel
大功告成!
欢迎指正!