前言
今天为大家带来利用Python爬虫抓取豆瓣电影《外太空的莫扎特》影评,废话不多说。
Let's start happily
开发工具
Python版本: 3.6.4
相关模块:
requests模块
json模块
re模块
os模块
bs4模块
pandas模块
time模块
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
思路分析
本文以爬取豆瓣电影《外太空的莫扎特》影评,讲解如何爬取豆瓣电影《外太空的莫扎特》影评!
前期准备
1.获取页面内容
def get_html(url):
"""获取网页全部数据"""
headers = Agent_info()
try:
r = requests.get(url=url, headers=headers, timeout=30)
r.encoding = r.apparent_encoding
status = r.status_code
datas = json.loads(r.text)["html"]
str_html = "{}".format(datas)
html = BeautifulSoup(str_html, "html.parser")
print("爬虫状态码: " + str(status))
# print(type(html))
return html
except Exception as e:
print("很遗憾,数据爬取失败!")
print(e)
2.提取数据
- 浏览器中打开我们要爬取的页面
- 按F12进入开发者工具,查看我们想要的数据在哪里
- 这里我们需要时间, 用户, 星级, 短评, 支持数
def etl_data(html):
"""提取数据"""
comments = html.find_all('div', 'comment-item')
# print(comments[0])
# 获取电影的评论并保存到列表(时间,用户,星级,短评,支持数)
datas = []
for span in comments:
# 短评发表的时间
times = span.find('span', 'comment-time').attrs['title']
# 用户名
name = span.find('a').attrs["title"]
# 用户评分星级
try:
level = span.find('span', 'rating').attrs['class'][0][-2:]
if (level == '10'):
level = "一星"
elif (level == '20'):
level = "二星"
elif (level == '30'):
level = "三星"
elif (level == '40'):
level = "四星"
elif (level == '50'):
level = "五星"
except Exception as e:
level = "无评价"
content = span.find('span', 'short').string.strip()
content = re.sub(r'\n', '', content)
# 短评支持数
love_point = span.find('span', 'vote-count').string.strip()
arr = [times, name, level, content, love_point]
datas.append(arr)
df = pd.DataFrame(datas)
df.columns = ["时间", "用户", "星级", "短评", "支持数"]
# print(arr)
return df
3.获取下一个页面url
def get_nextUrl(html):
"""抓取下一个页面的 url"""
try:
# 找到下一页的 url
url = html.find('a', 'next').attrs['href']
# print(url)
next_start = re.search(r'[0-9]\d{0,5}', url).group(0)
print("已经到 " + str(next_start) + " ,稍等一会儿\n")
next_url = "https://movie.douban.com/subject/35168646/comments?percent_type=" \
"&start={}&limit=20&status=P&sort=new_score&comments_only=1&ck=Cuyu".format(next_start)
# print(next_url)
return next_url
except:
print("到底了~")
运行结果
4.持久化存储数据代码实现
def save_data(data, fileName, Flag):
"""持久化存储数据"""
file_name = fileName + "_" + time.strftime("%Y_%m_%d", time.localtime(time.time())) + ".csv"
# print(file_name)
data.to_csv(file_name, index=False, header=Flag, mode='a', encoding="utf_8_sig")
if os.path.exists(file_name):
print(file_name + " 数据爬取并保存成功!")
else:
print('数据保存失败,请再次尝试!')
#代码测试2022.7.28无异常,点赞超过100,更新豆瓣读书Top250