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

这篇文章主要对比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/ )

时间: 2024-10-27 08:14:36

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

Python爬虫入门 | 4 爬取豆瓣TOP250图书信息

先来看看页面长啥样的:https://book.douban.com/top250 我们将要爬取哪些信息:书名.链接.评分.一句话评价-- 1. 爬取单个信息 我们先来尝试爬取书名,利用之前的套路,还是先复制书名的xpath: 得到第一本书<追风筝的人>的书名xpath如下: //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a 得到xpath,我们就可以按照之前的方法来尝试一下: 返回的竟然是

python爬虫--爬取豆瓣top250电影名

关于模拟浏览器登录的header,可以在相应网站按F12调取出编辑器,点击netwook,如下: 以便于不会被网站反爬虫拒绝. 1 import requests 2 from bs4 import BeautifulSoup 5 def get_movies(): 6 headers = { 7 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom

团队-爬取豆瓣Top250电影-开发文档

项目托管平台地址:https://gitee.com/wangdating/movie250开发内容: 首先我们选择使用Python脚本语言开发这个项目 代码:1.使用python的request库先获取网页内容下来(目标网址首页 url: https://movie.douban.com/top250) 2.解析html文件,提取出我们要提取的信息

团队-爬取豆瓣Top250电影-团队-阶段互评

团队名称:咣咣踹电脑学号:2015035107217姓名:耿文浩 得分10 原因:组长带领的好,任务分配的好,积极帮助组员解决问题学号:2015035107213姓名:周鑫 得分8 原因:勇于分担,积极完成任务学号:2015035107210姓名:张文博 得分 9 原因:态度认真负责学号:2015035107196姓名:王梓萱 得分9 原因:态度积极,帮助他人学号:2015035107202姓名:杨继尧 得分8 原因:有不懂的地方,还有提高的能力学号:2015035107218姓名:张永康 得分

《团队-爬取豆瓣Top250电影-团队-阶段互评》

学号:2015035107080得分:9.8原因:分工明确且具体,项目框架完成的最多,完成自己的之后会帮助别人. 学号:2015035107152得分:9.6原因:能很好的完成自己负责的部分,积极负责. 学号:2015035107004得分:9.5原因:积极寻找解决问题的答案,及时地完成了项目的总结报告并上交. 学号:2015035107001得分:9.3原因:能及时完成团队项目的任务,跟上进度,保持项目的进行. 学号:201503510707得分:8.8原因:认真完成每一项任务,及时提交代码.

【python爬虫】根据查询词爬取网站返回结果

最近在做语义方面的问题,需要反义词.就在网上找反义词大全之类的,但是大多不全,没有我想要的.然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把"老师"-"学生","医生"-"病人"这样对立关系的反义词查出来. 一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点: http://fanyici.xpcha.com/5f7x86

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

[python爬虫] Selenium定向爬取PubMed生物医学摘要信息

本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要.它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括其他与医学相关的领域,像是护理学或者其他健康学科.它同时也提供对于相关生物医学资讯上相当全面的支援,像是生化学与细胞生物学.        PubMed是因特网上使用最广泛的免费MEDLINE,该搜寻引

23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博等

来源:全球人工智能 作者:SFLYQ 今天为大家整理了23个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快 1.WechatSogou [1]– 微信公众号爬虫. 基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. github地址:https://github.com/Chyroc/WechatSogou 2.DouBanSpider [2]– 豆瓣