[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

2023-10-31

        这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对比,你可以进一步加深Python爬虫的印象。同时,文章给出了我以前关于爬虫的基础知识介绍,方便新手进行学习。
        总之,希望文章对你有所帮助,如果存在不错或者错误的地方,还请海涵~


一. DOM树结构分析

        豆瓣Top250电影网址:https://movie.douban.com/top250?format=text
        通过右键Chrome浏览器"审查元素"或"检查"可以定位具体的元素,如下图所示:


        图中由一部部电影构成,在HTML中对应:
        <li><div class="item">......</div></li>
        BeautifulSoup 通过 soup.find_all(attrs={"class":"item"}) 函数可以获取具体的信息,然后再定位具体内容,如 <span class="title">获取标题,<div class="star">获取分数和评价数。

        下一步需要注意的是,定位爬取网页元素还需要进行翻页,通常有两种方法:
        1.点击下一页分析URL网址进行分析它们之间的规律;
        2.Selenium可以获取页码按钮进行自动点击跳转。
        如下图所示,点击不同页码后分析URL:


        第2页URL:https://movie.douban.com/top250?start=25&filter=
        第3页URL:https://movie.douban.com/top250?start=50&filter=
        所以每页共25部电影,它们是存在规律的,再写一个循环即可获取所有电影信息。


二. BeautifulSoup爬取豆瓣信息


        入门推荐我的前文:[python知识] 爬虫知识之BeautifulSoup库安装及简单介绍
        具体代码如下:
# -*- coding: utf-8 -*-
"""
Created on 2016-12-29 22:50

@author: Easstmount
"""

import urllib2 
import re 
from bs4 import BeautifulSoup
import codecs

#爬虫函数
def crawl(url):
    page = urllib2.urlopen(url) 
    contents = page.read() 
    soup = BeautifulSoup(contents, "html.parser") 
    print u'豆瓣电影250: 序号 \t影片名\t 评分 \t评价人数'
    infofile.write(u"豆瓣电影250: 序号 \t影片名\t 评分 \t评价人数\r\n")
    print u'爬取信息如下:\n'
    for tag in soup.find_all(attrs={"class":"item"}):
        #print tag
        #爬取序号
        num = tag.find('em').get_text()
        print num   
        #爬取电影名称
        name = tag.find(attrs={"class":"hd"}).a.get_text()
        name = name.replace('\n',' ')
        print name
        infofile.write(num+" "+name+"\r\n")
        #电影名称
        title = tag.find_all(attrs={"class":"title"})
        i = 0
        for n in title:
            text = n.get_text()
            text = text.replace('/','')
            text = text.lstrip()
            if i==0:
                print u'[中文标题]', text
                infofile.write(u"[中文标题]" + text + "\r\n")
            elif i==1:
                print u'[英文标题]', text
                infofile.write(u"[英文标题]" + text + "\r\n")
            i = i + 1
        #爬取评分和评论数
        info = tag.find(attrs={"class":"star"}).get_text()
        info = info.replace('\n',' ')
        info = info.lstrip()
        print info
        mode = re.compile(r'\d+\.?\d*')
        print mode.findall(info)
        i = 0
        for n in mode.findall(info):
            if i==0:
                print u'[分数]', n
                infofile.write(u"[分数]" + n + "\r\n")
            elif i==1:
                print u'[评论]', n
                infofile.write(u"[评论]" + n + "\r\n")
            i = i + 1
        #获取评语
        info = tag.find(attrs={"class":"inq"})
        if(info): # 132部电影 [消失的爱人] 没有影评
            content = info.get_text()
            print u'[影评]', content
            infofile.write(u"[影评]" + content + "\r\n")
        print ''
        
        
#主函数
if __name__ == '__main__':
    
    infofile = codecs.open("Result_Douban.txt", 'a', 'utf-8')     
    url = 'http://movie.douban.com/top250?format=text'
    i = 0
    while i<10:
        print u'页码', (i+1)
        num = i*25 #每次显示25部 URL序号按25增加
        url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter='
        crawl(url)
        infofile.write("\r\n\r\n\r\n")
        i = i + 1
    infofile.close()
        输出结果如下所示:
豆瓣电影250: 序号 	影片名	 评分 	评价人数
1  肖申克的救赎  / The Shawshank Redemption  / 月黑高飞(港)  /  刺激1995(台) 
[中文标题]肖申克的救赎
[英文标题]The Shawshank Redemption
[分数]9.6
[评论]761249
[影评]希望让人自由。
2  这个杀手不太冷  / Léon  / 杀手莱昂  /  终极追杀令(台) 
[中文标题]这个杀手不太冷
[英文标题]Léon
[分数]9.4
[评论]731250
[影评]怪蜀黍和小萝莉不得不说的故事。
3  霸王别姬  / 再见,我的妾  /  Farewell My Concubine 
[中文标题]霸王别姬
[分数]9.5
[评论]535808
[影评]风华绝代。
4  阿甘正传  / Forrest Gump  / 福雷斯特·冈普 
[中文标题]阿甘正传
[英文标题]Forrest Gump
[分数]9.4
[评论]633434
[影评]一部美国近现代史。
5  美丽人生  / La vita è bella  / 一个快乐的传说(港)  /  Life Is Beautiful 
[中文标题]美丽人生
[英文标题]La vita è bella
[分数]9.5
[评论]364132
[影评]最美的谎言。
6  千与千寻  / 千と千尋の神隠し  / 神隐少女(台)  /  Spirited Away 
[中文标题]千与千寻
[英文标题]千と千尋の神隠し
[分数]9.2
[评论]584559
[影评]最好的宫崎骏,最好的久石让。 
        同时输出文件Reseult_Douban.txt,如下图所示:




三. Selenium爬取豆瓣信息及Chrome爬虫介绍


        入门推荐我的前文:
[Python爬虫] Selenium自动登录和Locating Elements介绍
        代码如下所示:

# -*- coding: utf-8 -*-
"""
Created on 2016-12-29 22:50

@author: Easstmount
"""

import time              
import re              
import sys    
import codecs    
import urllib   
from selenium import webdriver          
from selenium.webdriver.common.keys import Keys          


#爬虫函数
def crawl(url):
    driver.get(url)
    print u'豆瓣电影250: 序号 \t影片名\t 评分 \t评价人数'
    infofile.write(u"豆瓣电影250: 序号 \t影片名\t 评分 \t评价人数\r\n")
    print u'爬取信息如下:\n'
    content = driver.find_elements_by_xpath("//div[@class='item']") 
    for tag in content:
        print tag.text
        infofile.write(tag.text+"\r\n")
        print ''
        
    
#主函数
if __name__ == '__main__':

    driver = webdriver.Firefox()
    infofile = codecs.open("Result_Douban.txt", 'a', 'utf-8')     
    url = 'http://movie.douban.com/top250?format=text'
    i = 0
    while i<10:
        print u'页码', (i+1)
        num = i*25 #每次显示25部 URL序号按25增加
        url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter='
        crawl(url)
        infofile.write("\r\n\r\n\r\n")
        i = i + 1
    infofile.close()
        该部分代码会自动调用Firefox浏览器,然后爬取内容。调用如下所示:


        同时,也可以爬取文件如下图所示,也可以再定向分析具体的节点,其方式方法也是类似的。


        调用Chrome浏览器需要在:
        C:\Program Files (x86)\Google\Chrome\Application
        路径下放置一个 chromedriver.exe 驱动文件,再进行调用。核心代码:

    chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
    os.environ["webdriver.chrome.driver"] = chromedriver
    driver = webdriver.Chrome(chromedriver)
        但是可能会报错如下所示,需要保持版本一致。


        总结下两个代码的优缺点:BeautifulSoup比较快速,结构更加完善,但爬取如CSDN等博客会报错Forbidden;而Selenium可以调用浏览器进行爬取,自动化操作及动态操作,点击鼠标键盘等按钮比较方便,但其速度比较慢,尤其是重复的调用浏览器。

        最近年尾学院事情太多了,所以很少有定量的时间进行写博客,这其实挺悲伤的,但幸运的是遇见了她,让我在百忙之中还是体会到了一些甜蜜,陪着我工作。
        无需多言,彼此的心意一言一行里都能感受到爱意和温暖,follow you~
        (By:Eastmount 2016-12-30 晚上12点半  http://blog.csdn.net/eastmount/ )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息 的相关文章

随机推荐

  • php弹窗一次,网站广告弹出层(每天弹出一次)

    网站广告弹出层 每天弹出一次 可以有两种做法 一 是标识符存入数据库 二 利用Jquery cookie 我这里做的是比较简单的用到的知识是Jquery cookie 这里要注意的一点是jquery cookie的值 火狐能够获取 IE 3
  • VMware桥接模式无法识别英特尔AX200无线网卡解决办法

    1 先到英特尔网站下载最新驱动 更新网卡驱动适用于 Intel 无线网络卡的 Windows 10 和 Windows 11 Wi Fi 驱动程序 2 到控制面板查看无线网卡属性是否有下图组件 没有的话 依次操作 安装 服务 添加 从磁盘安
  • Unidbg系列--Ollvm字符串解密

    Ollvm字符串解密 原理 使用unidbg框架 模拟调用So文件 并Hook内存写操作 当so解密操作写入内存时 回调获取解密字符串 并将其写入新so文件中 达到反OLLVM字符串加密的目的 解密脚本 package com xCrack
  • openmvs编译

    OpenMVG 和OpenMVS在Widows下使用Vs2019编译 black world 博客园 cnblogs com cmake src G Visual Studio 16 2019 A x64 DCMAKE TOOLCHAIN
  • pyspark-ml学习笔记:模型评估

    问题是这样的 如果我们想基于pyspark开发一个分布式机器训练平台 那么肯定需要对模型进行评估 而pyspark本身自带模型评估的api很少 想进行扩展的话有几种方案 1 使用udf自行编写代码进行扩展 2 使用现有的 像sklearn中
  • CentOS安装Docker

    Docker是一个开源的容器引擎 它有助于更快地交付应用 Docker可将应用程序和基础设施层隔离 并且能将基础设施当作程序一样进行管理 使用 Docker可更快地打包 测试以及部署应用程序 并可以缩短从编写到部署运行代码的周期 CentO
  • 相机标定实战之双目标定

    相机标定原理 文章目录 相机标定原理 前言 一 采集图像 二 基于Matlab单双目标定流程 采集棋盘图 三 基于OpenCV Python双目标定流程 检测棋盘格角点 对角点进行亚像素精细化 单目标定 双目标定 双目校正 保存标定参数 读
  • 服务器系统怎么设置第一启动项,服务器怎么设置启动项

    服务器怎么设置启动项 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 您需要在源端服务器上安装迁移Agent并且输入目的端
  • java: 非法字符: ‘\ufeff‘解决方法

    出现问题 在使用idea时候会出现java 非法字符 ufeff 这样的情况 原因 出现这样的问题来源于这个BOM 一般在编写时候会给你默认添加这样的一个BOM头 是隐藏起来的 编译时候会给出现编码混乱问题 详见了解BOM 隐藏字符 百度百
  • 三调与二调图斑叠加分析,筛选不同地类面积占比,筛选举证图斑

    主要步骤 标识数据 叠加分析 用标识 生成所有相交图斑 属性有原图斑的地类和国家的地类 以及原图斑的面积 生成的面域 增加4个字段 图斑的三调一级类 图斑的国家NYYPDL 是否相同 标识后的图斑面积 转换三调地类为二调的一级类 转换国家地
  • 《最强大脑第九季》C#手撸傅立叶残影题目

    在最新一季的最强大脑总决赛中 有一个比赛项目 傅立叶残影 感觉印象深刻 原理就是五根针首尾相连 按照自身的转速和杆长运动 根据提供的每根杆的转速和杆长来判断出尾部运动的残影轨迹 原理比较简单 就是一个连杆运行 好吧 知道原理就可以动手开始撸
  • 整数除法JS

    param number a param number b return number var divide function a b const MIN Math pow 2 31 const MAX Math pow 2 31 1 判断
  • Redis的事务学习及用Redis实现乐观锁,redis数据类型总结

    一 Redis的事务操作 1 Redis 事务可以一次执行多个命令 并且带有以下三个重要的保证 批量操作在发送 EXEC 命令前被放入队列缓存 收到 EXEC 命令后进入事务执行 事务中任意命令执行失败 其余的命令 依然被执行 但是如果队列
  • C语言基础知识--变量

    目录 一 C语言变量 1 局部变量 1 什么是局部变量 2 代码示例 3 代码讲解 2 全局变量 1 什么是全局变量 2 代码示例 3 代码讲解 3 静态变量 1 全局静态变量 2 局部静态变量 3 代码示例 4 代码讲解 4 const常
  • 用Python制作一个自动抢票脚本

    前言 大麦网 是中国综合类现场娱乐票务营销平台 业务覆盖演唱会 话剧 音乐剧 体育赛事等领域 但是因为票数有限 还有黄牛们不能丢了饭碗 所以导致了 很多人都抢不到票 那么 今天带大家用Python来制作一个自动抢票的脚本小程序 知识点 面向
  • 死锁产生的条件及其如何处理

    一 原因与条件 产生死锁的原因主要是 因为系统资源不足 进程运行推进的顺序不合适 资源分配不当等 发生死锁的四个必要条件 相互排斥 所涉及的资源必须不可共享 否则 将不会阻止进程在必要时使用资源 保留并等待或部分分配 进程在等待其他 请求的
  • Quartus II 操作入门

    使用Quartus设计FPGA 简单包括以下流程 新建工程 写代码 编译工程 找错误 分配引脚 重编译 下载配置 到硬件 为保证设计的正确性 在编译后 一般还需要做仿真验证 然后下载至硬件 有两种仿真方式 功能仿真 时序仿真 新建工程 写代
  • (数学)GCD总结

    目录 简介 算法实现 代码 应用 简介 GCD即Greatest Common Divisor 例如 12和30的公约数有 1 2 3 6 其中6就是12和30的最大公约数 两个整数的最大公约数主要有两种寻找方法 两数各分解质因子 然后取出
  • Python + Selenium 练习篇 - 获取页面所有邮箱

    代码如下 coding utf 8import re python中利用正则 需要导入re模块from selenium import webdriverdriver webdriver Chrome driver maximize win
  • [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息 两种方法从本质上都是一样的 都是通过分析网页的DOM树结构进行元素定位 再定向爬取具体的电影信息 通过代码的对比 你可以进一步加深Python爬虫的印