【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据(1)

目录

前言

一、配置环境

1.1、 安装Python

1.2、 安装Requests库和BeautifulSoup库

1.3.、安装Matplotlib

二、登录豆瓣网(重点)

2.1、获取代理

2.2、测试代理ip是否可用

2.3、设置大量请求头随机使用

2.4、登录豆瓣网

三、爬取某一部热门电影数据

3.1、爬取全部长、短评论

3.2、获取用户观影数据

3.3、存入数据库

四、实战代码示例

五、总结


前言

豆瓣网是一个具有影响力的电影评论网站,其中包含大量的用户评论和评分数据。这些数据可以用于研究电影市场和用户观影习惯,同时还可以用于电影推荐算法以及在线视频网站的用户行为分析等方面,因此对于想要学习数据分析和机器学习的人来说,爬取豆瓣网电影评论数据是一个很好的练手项目。

本文将详细介绍如何使用Python爬虫抓取豆瓣网电影评论用户的观影习惯数据,并进行简单的数据处理和分析。

一、配置环境

在开始爬取豆瓣网电影评论数据之前,我们需要配置好Python开发环境和相关依赖库。

1.1、 安装Python

首先,我们需要安装Python。建议使用Python 3.x版本。可以在官网下载并安装对应版本的Python:https://www.python.org/downloads/。

1.2、 安装Requests库和BeautifulSoup库

接下来,我们需要安装两个Python库:Requests和BeautifulSoup。Requests库可以用于发送HTTP请求,获取网页内容,而BeautifulSoup库可以用于解析HTML文档,提取所需数据。

可以使用pip命令自动安装这两个库:

pip install requests
pip install beautifulsoup4
1.3.、安装Matplotlib

如果我们需要对抓取的数据进行可视化分析,可以使用Matplotlib库。可以使用pip命令安装:

pip install matplotlib

安装完成后,我们就可以开始爬取豆瓣网电影评论数据了。

二、登录豆瓣网(重点)

豆瓣网对爬虫有一定的反爬虫策略,根据实战经验反爬一般作用于用户ID、用户IP和请求头的过滤,为了避免被封禁IP,代码中需要加入一些反爬虫措施:

  • 设置请求间隔
  • 使用代理IP
  • 伪装请求头等
    2.1、获取代理

    使用代理可以帮助我们隐藏自己的真实IP地址,避免被封禁IP或者限制访问。在爬取豆瓣网电影评论数据时,如果频繁地访问同一个IP地址,豆瓣网可能会禁止我们的访问,因此使用代理也可以防止被封禁。这里我使用的是站大爷代理ip来进行操作的。

    以下是使用用户名+密码授权获取ip代码示例:

     import requests
    #你要访问的网址
    url = 'http://www.ip138.com/'
    proxies = {
            'http': 'http://账号:密码@ip:port',
            'https': 'http://账号:密码@ip:port'
    #“用户名+密码”授权,账号为实例ID,密码为8位数字的密码,不用MD5加密,在后台的实例管理下可以看到
        }
    response = requests.get(url, proxies=proxies)
    
    2.2、测试代理ip是否可用

    测试代理IP是否可用是为了确保我们使用的代理IP能够正常工作,防止由于代理IP失效或无效而导致爬虫请求失败。一般来说,我们可以通过发送请求来测试代理IP是否可用,如果请求成功则说明代理IP可用,否则说明代理IP无效或被封禁。

    测试代理IP的代码可以通过如下方式实现:

    1. 定义一个函数,接收代理IP和目标网站URL作为参数
    2. 在函数中,使用requests库发送请求,并设置代理IP
    3. 如果请求成功,则说明代理IP可用,返回True
    4. 如果请求失败,则说明代理IP无效或被封禁,返回False

    以下是一段测试代理IP的代码示例:

    import requests
    def test_proxy_ip(proxy_ip, target_url):
        proxies = {
           'http': 'http://' + proxy_ip,
            'https': 'http://' + proxy_ip
        }
        try:
            response = requests.get(target_url, proxies=proxies, timeout=5)
            if response.status_code == 200:
                return True
            else:
                return False
        except:
            return False
    

    在上述代码中,我们定义了一个test_proxy_ip函数,该函数接收代理IP和目标网站URL作为参数。在函数中,我们首先根据传入的代理IP构造proxies字典,然后使用requests库发送请求,并设置proxies参数为该字典。如果请求成功,则说明代理IP可用,函数返回True;否则函数返回False。

    当我们在爬取豆瓣网电影评论数据时,可以使用上述代码测试代理IP是否可用。如果代理IP可用,则使用该代理IP发送请求;如果代理IP无效或被封禁,则需要更换新的代理IP。

    2.3、设置大量请求头随机使用

    爬取豆瓣网电影评论用户的观影习惯数据要设置大量请求头随机使用是为了防止网站监测到我们的请求头是模拟的,并防止被反爬虫机制封禁IP。因此,我们需要尽可能多的提供不同的请求头信息,对请求头进行随机使用,以降低被监测到的概率。

    以下是一个随机使用请求头的示例代码:

    import random
    USER_AGENTS = [
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582',
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
      # 更多用户代理信息...
    ]
    def get_random_user_agent():
        return random.choice(USER_AGENTS)
    headers = {
       'User-Agent': get_random_user_agent(),
       'Referer': 'https://www.douban.com',
       'Cookie': 'your_cookie'
    }
    

    在以上代码中,我们定义了一个USER_AGENTS列表,包含多个常用浏览器的User-Agent信息。然后定义了一个get\_random\_user\_agent()函数,用于随机从USER_AGENTS列表中获取一个User-Agent信息。最后,我们设置headers变量,使用get\_random\_user\_agent()函数获取随机的User-Agent信息,并将其赋值到headers变量中,作为请求头信息。

    需要注意的是,我们在使用随机请求头的同时,仍然需要保持一定的爬取速度和请求间隔,以避免被封禁。同时,如果服务器在返回的内容中发现请求头信息异常,我们也可能被视为爬虫而被封禁。因此,在进行豆瓣网电影评论用户数据爬取时,需要谨慎处理请求头信息。

    2.4、登录豆瓣网

    以下是一个使用selenium模拟登录豆瓣网并保存cookie的示例代码:

    from selenium import webdriver
    import time
    import pickle
    login_url = 'https://accounts.douban.com/passport/login?source=movie'
    username = 'your_username'
    password = 'your_password'
    cookie_file = 'cookies.pkl'
    # 启动浏览器
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    # 访问登录页面
    driver.get(login_url)
    # 输入用户名和密码
    driver.find_element_by_id('username').send_keys(username)
    driver.find_element_by_id('password').send_keys(password)
    # 等待用户输入验证码
    time.sleep(30)
    # 点击登录按钮
    driver.find_element_by_class_name('account-form-field-submit ').click()
    # 等待新页面加载完成
    time.sleep(10)
    # 保存cookie到文件
    cookies = driver.get_cookies()
    with open(cookie_file, 'wb') as f:
        pickle.dump(cookies, f)
    # 关闭浏览器
    driver.quit()
    

    在以上代码中,我们首先初始化了一些变量,包括登录页面的URL、豆瓣账号的用户名和密码、以及保存cookie的文件名。

    然后,我们启动了Chrome浏览器,并通过driver.get()方法访问了豆瓣登录页面。接着,我们使用selenium模拟了用户在页面上输入了用户名和密码,并等待了30秒,以留出时间输入验证码。

    最后,我们点击登录按钮,等待新页面加载完成,获取了cookies并将其保存到本地文件中。注意,这里我们使用了pickle模块将cookies对象序列化并保存到文件中,以便后续使用。

    同时,我们还使用了driver.quit()方法关闭了浏览器。

    三、爬取某一部热门电影数据

    前面我们已经把爬取豆瓣网的准备工作全部完成,然后接下来就是爬取豆瓣网中某一部热门电影的各种数据了

    3.1、爬取全部长、短评论

    爬取热门电影的全部长短评论可以获得以下信息:

    • 用户评价:通过阅读用户的评论,可以了解用户对电影的评价、看法和推荐指数等信息,有助于我们更好地了解电影的口碑和观众反应。
    • 关键词提取:通过分析评论文本提取关键词,可以了解电影的主题、情感、人物关系等信息,有助于我们深入了解电影的故事情节和风格。
    • 数据分析:通过统计评论数量、评分分布、用户画像等数据,可以帮助我们更好地了解电影的市场表现和受众群体,为影视公司、制片人和电影院等决策者提供有价值的数据支持。

      因此,爬取热门电影的全部长短评论是一项非常有价值的工作,可以为我们提供大量有用的信息和数据分析基础。

      以下是一个使用BeautifulSoup和requests库爬取豆瓣网某部电影全部长、短评论说明的示例代码

      import requests
      from bs4 import BeautifulSoup
      # 设置请求头
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
      }
      # 豆瓣电影页面URL
      url = 'https://movie.douban.com/subject/1292052/'
      # 发送请求获取页面HTML
      response = requests.get(url, headers=headers)
      html = response.text
      # 使用BeautifulSoup解析HTML
      soup = BeautifulSoup(html, 'html.parser')
      # 查找长评和短评标签
      long_comments = soup.select_one('#hot-comments > div > div.article > span')
      short_comments = soup.select_one('#comments > div > h2 > span')
      # 提取评论数量并输出
      long_comments_count = long_comments.text.replace('全部', '').replace('条', '').strip()
      short_comments_count = short_comments.text.replace('全部', '').replace('条', '').strip()
      print(f"长评:{long_comments_count}")
      print(f"短评:{short_comments_count}")
      # 查找所有长评和短评内容
      long_comments_list = soup.select('#hot-comments > div > div.article > div > div.comment > p')
      short_comments_list = soup.select('#comments > div > div.comment > p')
      # 输出每个评论的内容
      for comment in long_comments_list:
          print(comment.text.strip())   
      for comment in short_comments_list:
          print(comment.text.strip())
      

      在以上代码中,我们首先设置了请求头,指定了请求的User-Agent信息。然后,我们定义了电影页面的URL,并发送了GET请求获取了页面的HTML。

      接着,我们使用BeautifulSoup解析了页面的HTML,并查找了长评和短评标签。通过提取标签文本中的评论数量信息,我们可以输出电影的长、短评数量。

      最后,我们再次使用CSS选择器查找所有长、短评内容,并通过遍历列表输出了每个评论的文本内容。

      3.2、获取用户观影数据

      获取用户观影数据可以帮助我们了解用户的观影喜好和习惯,可以通过分析用户的观影历史和评分记录等内容,得到以下信息:

      • 用户偏好:根据用户观影历史和评分记录,可以了解用户的观影偏好和喜好,有助于我们推荐更符合用户口味的电影和影视作品
      • 影视推荐:通过分析用户的观影历史和评分记录,可以为用户推荐更符合其口味的电影和影视作品,提高用户体验和满意度
      • 数据分析:通过统计用户评分和观影记录,可以了解影片的市场表现和受众群体,为制片人、电影院和影视公司等提供有价值的数据分析支持

        因此,获取用户观影数据是一项非常有价值的工作。以下是获取用户观影数据的Python代码示例:

        import requests
        import json
        # 登录豆瓣网
        session = requests.session()
        url = 'https://accounts.douban.com/j/mobile/login/basic'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
            'Referer': 'https://accounts.douban.com/passport/login',
        }
        data = {
            'name': 'your_username', # 替换为自己的用户名
            'password': 'your_password', # 替换为自己的密码
            'remember': 'false',
        }
        session.post(url, headers=headers, data=data)
        # 获取用户观影数据
        uid = 'your_user_id' # 替换为自己的用户ID
        url = 'https://movie.douban.com/subject_suggest?q=%E7%94%B5%E5%BD%B1' # 电影页面URL
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
            'Referer': 'https://www.douban.com/',
        }
        response = session.get(url, headers=headers)
        data = json.loads(response.text)
        movie_id = data[0]['id'] # 获取电影ID
        url = f'https://movie.douban.com/subject/{movie_id}/' # 获取电影详情页面URL
        response = session.get(url, headers=headers)
        url = response.url + 'comments?start=0&limit=20&status=P&sort=new_score' # 获取电影短评页面URL
        response = session.get(url, headers=headers)
         **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
        **深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
        **因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
        ![img](https://img-blog.csdnimg.cn/img_convert/29f2b3122c339af1a48bed5a832d3f5c.png)
        ![img](https://img-blog.csdnimg.cn/img_convert/6a83bed2244ec66f757e1c1cc0f93540.png)
        ![img](https://img-blog.csdnimg.cn/img_convert/e09f3a9e47a6f2bbc2e65f2de784fb5e.png)
        ![img](https://img-blog.csdnimg.cn/img_convert/a395b3003ce41be7c7faf620afc7bee4.png)
        ![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
        ![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
        **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
        **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
        **如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
        4733911)]
        [外链图片转存中...(img-bp294Euh-1712964733911)]
        ![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
        ![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
        **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
        **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
        **如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**