基于python爬取豆瓣导演的电影数据

背景描述:在豆瓣网爬取导演的电影作品,为后续演员之间的关联关系分析提供数据。

目标导演:徐峥

完整代码:

from lxml import etree
import time
from selenium import webdriver
import pandas as pd

"""
这里我们需要使用ChromeDrvier来做模拟
Step1,打开谷歌浏览器, 在地址栏输入 chrome://version/  查看版本信息
Step2,ChromeDriver版本下载地址:http://chromedriver.storage.googleapis.com/index.html
Step3,放到C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe路径
"""
chrome_driver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
driver = webdriver.Chrome(executable_path=chrome_driver)
# 设置想要下载的导演 数据集('徐峥'前加u,目的是保证汉字编码是utf-8)
director = u'徐峥'
# 爬取数据的url地址
base_url = 'https://movie.douban.com/subject_search?search_text=' + director + '&cat=1002&start='

# 创建空字典
movie_actors = {}

# 下载指定页面的数据
def download(request_url):
    driver.get(request_url)
    # 停顿1秒钟
    time.sleep(1)
    # 获得整个文档的HTML
    html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
    # 解析html文档
    html = etree.HTML(html)
    # 设置电影名称,导演演员 的XPATH
    # html.xpath()的返回结果是list列表
    # 拿到的是电影名称列表
    movie_lists = html.xpath(
        "/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']")
    # 拿到的是演员名称列表
    name_lists = html.xpath(
        "/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='meta abstract_2']")
    # 获取返回的数据个数
    num = len(movie_lists)
    # print(num)

    if num > 15:  # 第一页会有16条数据(第一条数据是导演介绍,因为定位电影名称和演员名称的标签顺序表和导演介绍的标签顺序表一样)
        # 不要导演介绍,所以第一条数据需要去掉
        movie_lists = movie_lists[1:]
        name_lists = name_lists[1:]
    for (movie, name_list) in zip(movie_lists, name_lists):
        # 会存在数据为空的情况(真的有空值,第七页第四条数据,name_list为空值)
        if name_list.text is None:
            # 结束当前迭代,并执行下一次迭代(演员为空的那一条数据舍弃,最终有99条数据)
            continue
        # 显示下演员名称(以'/'来分隔数据,names是list列表)
        names = name_list.text.split('/')
        # 在movie_actors字典中,电影名和众多演员对应
        movie_actors[movie.text] = name_list.text.replace(" ", "")
        print(name_list.text.replace(" ", ""))
    print('OK')  # 代表这页数据下载成功
    if num >= 15:
        # 数据个数>=15,说明这一页数据满了,可能还有下一页,所以返回True,告知程序可以继续下一页去下载数据
        # 继续下一页
        return True
    else:
        # 如果这一页数据小于15,说明后面没有数据了,所以返回False,告知程序没有下一页了
        # 没有下一页
        return False


# 开始的ID为0,每页增加15(因为url地址后面的数字,当切换到下一页时会增加15,第一页start=0)
start = 0
while start < 10000:  # 以此来控制获取电影的数量
    # 字符串拼接来得到下一页的url
    request_url = base_url + str(start)
    # 下载数据,并返回是否有下一页(download方法会有返回值True、False)
    flag = download(request_url)
    if flag:
        start = start + 15
    else:
        break

# 将字典类型转化为DataFrame(电影名做列名,每个电影对应的全部演员为该列下的值,最终只有一行很长的数据)
movie_actors = pd.DataFrame(movie_actors, index=[0])
# print(movie_actors)

# DataFrame 行列转换
movie_actors = pd.DataFrame(movie_actors.values.T, index=movie_actors.columns, columns=movie_actors.index)
movie_actors.index.name = 'title'
movie_actors.set_axis(['actors'], axis='columns', inplace=True)
# 默认存放索引index
movie_actors.to_csv('./movie_actors.csv', encoding='utf_8_sig')
print('finished')

爬取结果展示:

 

如有疏漏之处,望批评指正。

 

posted @ 2020-10-13 10:14  mingke07  阅读(906)  评论(0)    收藏  举报