Python爬虫项目 ,爬取豆瓣top250中影片信息
程序员文章站
2022-05-25 09:47:05
第一个Python爬虫项目 , 将爬取到的信息存到Excel表格中#-*- codeing = utf-8 -*-#@Time : 2020-07-17 19:27#@Author : 姚云峰#@File : demo1.py#@Software : PyCharmfrom bs4 import BeautifulSoup # 网页解析 , 获取去数据import re # 正则表达式进行文字匹配import urllib.request,urllib.error # 制定url获取网...
第一个Python爬虫项目 , 将爬取到的信息存到Excel表格中
#-*- codeing = utf-8 -*-
#@Time : 2020-07-17 19:27
#@Author : 姚云峰
#@File : demo1.py
#@Software : PyCharm
from bs4 import BeautifulSoup # 网页解析 , 获取去数据
import re # 正则表达式进行文字匹配
import urllib.request,urllib.error # 制定url获取网页数据
import xlwt # 进行excel操作
import sqlite3 #进行sqllite数据库操作
# 主方法
def main():
baseUrl = "https://movie.douban.com/top250?start="
# 爬取网页
datalist = getData(baseUrl)
# 保存路径
savePath = "./豆瓣电影Top.xls"
# 保存数据
saveData(datalist , savePath)
# askURL("https://movie.douban.com/top250?start=0")
# 获取影片链接的规则
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) # 保存获取到的网页源码
# 逐一解析数据
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all("div",class_="item"): # 查找符合要求的字符串形成列表
# print(item) #测试:查看item电影全部信息
# break
data = [] # 保存一步电影的全部信息
item = str(item)
# 获取影片详情链接
link = re.findall(findLink , item)[0] # re库用来查找 , 通过正则表达式查找指定的字符串
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/81.0.4044.129 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):
# 保存数据
workbook = xlwt.Workbook(encoding="utf-8" , style_compression=0) # 创建workbook对象
worksheet = workbook.add_sheet('豆瓣电影top250' , cell_overwrite_ok=True) # 创建工作表
col = ('电影详情链接' , "图片链接" , "影片中文名" , "影片外国名" , "评分" , "评价数" , "概况" , "相关信息")
for i in range(0 , 8):
worksheet.write(0 , i , col[i]) # 列名
for i in range(0 , 250):
print(f'第{i+1}条')
data = datalist[i]
for j in range(0 , 8):
worksheet.write(i+1 , j , data[j])
workbook.save(savePath)
if __name__ == "__main__": #当程序执行时
# 调用函数
main()
print("爬取完毕")
本文地址:https://blog.csdn.net/weixin_44735933/article/details/107470324