前言:
在开始本文之前,我非常建议先学习下我写的第一篇爬虫练习的文章:https://blog.youkuaiyun.com/hahameier/article/details/110558398,里面有涉及到一些基本的东西。
在本文中,我会循序渐进,从爬取两个信息来带大家熟悉和学习下整体的流程(代码较少,帮助小白克服一堆代码的恐惧),然后才会延伸至多个信息的爬取。
本文将会非常适合知道了一些爬虫的基础知识,但是还没用实际例子来尝试的朋友。
参考链接:
1、百度大脑的教程《深度学习导论与应用实践》第二章节的课后习题:
https://aistudio.baidu.com/aistudio/projectDetail/101811
【但是代码部分已经不适用于现在的版本了,需要进行重构,本文会给出自己写的能运行的最新版的代码。】
2、上一篇自己写的爬虫练习:https://blog.youkuaiyun.com/hahameier/article/details/110558398
核心代码:
1、爬取所需要的内容:
def getContent(self, html):
findTitle = re.compile(r'<span class="title">(.*)</span>') # 找到片名
findLink = re.compile(r'<a href="(.*?)">') # 找到影片详情链接
datalist = []
for item in html.find_all('div', class_='item'): # 找到每一个影片项
data = []
item = str(item) # 转换成字符串
link = re.findall(findLink, item)[0]
data.append(link) # 添加详情链接
titles = re.findall(findTitle, item)
# 片名可能只有一个中文名,没有外国名;但我们只取中文名
if len(titles) == 2:
ctitle = titles[0]
data.append(ctitle) # 添加中文片名
otitle = titles[1].replace("/", "") # 去掉无关符号
else:
data.append(titles[0]) # 添加中文片名
datalist.append(data)
return datalist
2、保存所爬取的内容:
def saveData(self, datalist):
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('豆瓣电影Top25', cell_overwrite_ok=True)
col = ('电影详情链接', '影片中文名')
for i in range(0, 2):
sheet.write(0, i, col[i]) # 列名
for i in range(0, 25):
for j in range(0, 2):
print(datalist[i][j])
sheet.write(i+1, j, datalist[i][j]) # 数据
book.save(self.path) # 保存
完整代码:
from bs4 import BeautifulSoup
import re
import xlwt
import requests
class GetTopMovie:
def __init__(self, url):
self.url = url
self.path = r'/Users/NewScenery/SelfLearning-20201203/豆瓣电影Top25.xls'
self.headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS 。。。) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
"referer": "https://movie.douban.com/top250?start="
} # headers用你们自己的
# 获取Html
def getHtml(self, url):
res = requests.get(url, headers=self.headers)
if res.status_code == 200:
html = BeautifulSoup(res.text, 'html.parser')
return html
def getContent(self, html):
findTitle = re.compile(r'<span class="title">(.*)</span>') # 找到片名
findLink = re.compile(r'<a href="(.*?)">') # 找到影片详情链接
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) # 找到影片相关内容:导演,主演,年份,地区,类别
remove = re.compile(r' |\n|</br>|\.*') # 去掉无关内容
datalist = []
for item in html.find_all('div', class_='item'): # 找到每一个影片项
data = []
item = str(item) # 转换成字符串
# print(item)
link = re.findall(findLink, item)[0]
data.append(link) # 添加详情链接
titles = re.findall(findTitle, item)
if len(titles) == 2: # 中文名字,其他名字
ctitle = titles[0]
data.append(ctitle) # 添加中文片名
otitle = titles[1].replace("/", "") # 去掉无关符号
else:
data.append(titles[0]) # 添加中文片名
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(remove, "", bd)
bd = re.sub('<br(\s+)?\/?>(\s+)?', " ", bd) # 去掉<br >
bd = re.sub('/', " ", bd) # 替换/
data.append(bd.strip())
datalist.append(data)
return datalist
def saveData(self, datalist):
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('豆瓣电影Top25', cell_overwrite_ok=True)
col = ('电影详情链接', '影片中文名')
for i in range(0, 2):
sheet.write(0, i, col[i]) # 列名
for i in range(0, 25):
for j in range(0, 2):
print(datalist[i][j])
sheet.write(i+1, j, datalist[i][j]) # 数据
book.save(self.path) # 保存
def func(self):
url = self.url
self.saveData(self.getContent(self.getHtml(url)))
if __name__ == '__main__':
b = GetTopMovie('https://movie.douban.com/top250?start=') # 获取前25部电影
b.func()
print('爬取并保存成功!')
后记:
如果对你有收获,请不要吝惜你的双手,给我点个赞吧~哈哈哈
如果有问题的小伙伴可以留言~
要一点一点的进步哦~