今天帮朋友爬取豆瓣电影的数据,以便进行社交网络分析。
点击会出现新的电影数据。说明这是一个动态网站,需要使用selenium来爬取。
selenium 是一个非常简单方便的库,用来模拟人进行上述操作。但是需要提前安装好这个库,而且需要安装火狐或者Chrome浏览器的geckodriver,具体的细节可以阅读官方教程,或者其他网上的一些教程。
这里以点击 加载更多 10次为例,爬取200部电影数据。
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 20 10:10:41 2020
@author: zxw
"""
# 引入库
from selenium import webdriver
import time
import pandas as pd
start_url = 'https://movie.douban.com/'
def get_driver():
try:
return webdriver.PhantomJS()
except Exception:
return webdriver.Firefox()
driver = get_driver()
driver.get(start_url)
# 点击“分类”
driver.find_element_by_link_text('分类').click()
time.sleep(1)
# 点击“电影”
driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div[1]/div/div/div[1]/div[1]/ul[1]/li[2]/span').click()
time.sleep(1)
# 点击“喜剧”
driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div[1]/div/div/div[1]/div[1]/ul[2]/li[3]/span').click()
time.sleep(1)
# 点击“中国大陆”
driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div[1]/div/div/div[1]/div[1]/ul[3]/li[2]/span').click()
time.sleep(1)
# 点击“展开列表”
driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div[1]/div/div/div[1]/div[2]/div[2]/div[2]/a[2]/span').click()
time.sleep(1)
# 设置点击“加载更多”的次数
n = 10
for i in range(n):
driver.find_element_by_class_name('more').click()
time.sleep(1)
# 爬取数据
title = driver.find_elements_by_class_name('title')
rating = driver.find_elements_by_class_name('rating')
cast = driver.find_elements_by_class_name('cast')
data = pd.DataFrame({
"电影":title,"评分":rating,"导演":cast,"主演":cast})
data['电影'] = data['电影'].apply(lambda x: x.text)
data['评分'] = data['评分'].apply(lambda x: x.text)
data['导演'] = data['导演'].apply(lambda x: x.text.split('\n')[0][3:].split('/'))
data['主演'] = data['主演'].apply(lambda x: x.text.split('\n')[1][3:].split('/'))
# 输出
outputpath='c:/Users/zxw/Desktop/修身/与自己/数据科学/爬虫/豆瓣电影/movie.csv' ## 路径需要自己改!
data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')