前言
今天爲大家帶來利用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 = "<html>{}</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