关闭

基于BeautifulSoup爬取豆瓣网上的电影信息

标签: python豆瓣爬虫统计学
145人阅读 评论(0) 收藏 举报
分类:

基于BeautifulSoup实现爬取豆瓣网上的电影信息

这些天在学习Python,了解到用Python做网页网页爬虫非常的方便,于是琢磨着写了一个简单的爬虫程序(感谢万能的beautifulSoup框架,ps:做网页解析太方便了)。当然这是计划中的一部分,说来话长,一开始本来想做一个电影推荐系统(当然和豆瓣的推荐系统不太一样),传统的推荐系统是利用基于一种统计的方法,利用观众对电影的评分进行统计学处理找到合适的电影推荐个用户(涉及协作型过滤,搜集偏好,相似度评价等过程);但是这是一种“大多数说好,就是好的”推荐方法。我想做的是一种主动式的推荐方法:利用对电影的理解(包括电影分格、剧情、演员等要素)对电影本身进行相似度计算,例如一个用户喜欢看《康熙王朝》,康熙王朝的剧情是讲述了一代圣君康熙从登记到归天所做的丰功伟绩,根据对剧情的分析,相类似的还有《汉武大帝》,《成吉思汗》,《雍正王朝》等电视剧,当然豆瓣推荐也能达到这种效果(在豆瓣主页上输入一个电影名字以后,出现的网页下面会有一栏“喜欢这部电影的人也喜欢......”),推荐本质是不一样的,我设想的方法更多的是对剧情的理解,来找相关的电影,更多涉及的技术难点是对自然语言语义的理解、相似度分析,而不是基于大多数人的“共同爱好”来进行推荐。万里长城还是得一步一步的走,先爬下来网页数据才是首要任务。
先说下我的网页爬虫实现的功能:可以根据豆瓣网上的不用电影分类进行单独的爬取,在程序中,我爬取了电影的名字、电影的评分、以及评论该电影的观众的数量三个数据,并且可以设置爬取的电影的数据的量(当然理论上是可以无限制的爬取豆瓣上的所有电影)。
**接下来的内容将分两部分介绍:**
            1. BeautifulSoup简单介绍
            2. Python爬虫的实现

一、BeautifulSoup简洁

简单来说,BeautifulSoup是python的一个库,最主要的功能室从网页上解析数据,官方的解释如下:
  **Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。**  
[当然,如果想要系统学习的话,还是去查看官方文档,写的特别详细,而且有详细的实例,可以快速入门。](https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html)
在我的爬虫程序中,其实主要用的解析函数只有一个,即find_all()函数,如下实例:
#网页源码:
# <html>
#  <head>
#   <title>
#    The Dormouse's story
#   </title>
#  </head>
#  <body>
#   <p class="title">
#    <b>
#     The Dormouse's story
#    </b>
#   </p>
#   <p class="story">
#    Once upon a time there were three little sisters; and their names were
#    <a class="sister" href="http://example.com/elsie" id="link1">
#     Elsie
#    </a>
#    ,
#    <a class="sister" href="http://example.com/lacie" id="link2">
#     Lacie
#    </a>
#    and
#    <a class="sister" href="http://example.com/tillie" id="link2">
#     Tillie
#    </a>
#    ; and they lived at the bottom of a well.
#   </p>
#   <p class="story">
#    ...
#   </p>
#  </body>
# </html>
上述程序打印出的是网页的源代码,很容易看出上述代码的特点,<p>和<\p>、<body><\body>、<a>和<\a>等都是成对出现的,这就是HTML代码的特点,利用beautifulSoup中的find_all()函数可以分别解析出各个标签下的内容
soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
只要在find_all()函数的参数中传入‘a’,那么就能解析出网页内容中所有包含<a>和<\a>内容了,而且是以序列的方式返回,是不是觉着非常方便,当然这只是find_all函数的一个简单用法,还有一个用法就是可以根据属性值进行查询,在标签内部,有些参数是属于属性值,例如id="link1"、class="tip-link"等值,find_all函数同样能胜任查找具有某个属性的标签,例如:
soup.find_all(id='link2')
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
这只是在本文中的爬虫程序中用到的两个基本功能,更多关于find_all()函数的妙用请查看官方文档。。。

二、爬虫程序的Python实现:

知道了用到的基本技术之后,相信如果对python有一定基础的,很快就能搞定爬虫程序了,接下来是整个的源代码:
#-*— coding:UTF-8 -*-
from bs4 import BeautifulSoup #导入BeautifulSoup模块
import requests  #导入requests网页请求模块
initUrl = 'https://movie.douban.com'   #豆瓣网网址
urls = 'https://movie.douban.com/tag/#!/i!/ckDefault'  #豆瓣网所有电影的分类网址
#获得电影的分类信息,以便下一步从分类信息中分类的爬取网页
def requreMovieLable(url = urls):
    data = []
    web_data = requests.get(url) #根据网页链接获取网页源代码
    soup = BeautifulSoup(web_data.text) #网页预处理
    cataLog = soup.tbody.find_all('a')  #获取html源代码中含有<a><\a>标签中的内容
    for item in cataLog:
        data.append(initUrl + item.get('href'))     #提取<a><\a>标签中的网页链接
        # print data
    return data #以列表形式返回各个电影标签的网页链接,例如data[0]中包含‘爱情’分类的电影,data[1]中包含‘喜剧’分类的电影,等等
#爬取该网页的电影名称、评分、评论人数等信息
def parsMovie(url = urls):
    web_data = requests.get(url)     #根据网页链接获取网页源代码
    soup = BeautifulSoup(web_data.text) #网页预处理
    movieNamePre = soup.find_all(class_="nbg") #寻找网页源代码中含有属性值为‘class_="nbg"’的特定标签
    movieValueAndNumPre = soup.find_all(class_='star clearfix')  #寻找网页源代码中含有属性值为‘class_='star clearfix'’的特定标签
    movieValue = []     #存储电影的评分值
    movieNum = []       #存储特定电影的评论人数
    for item in movieValueAndNumPre:
        movieValue.append(item.span.next_sibling.next_sibling.text)  #存储电影的评分
        movieNum.append(item.span.next_sibling.next_sibling.next_sibling.next_sibling.text)    #存储电影的评论数
    # print movieValueAndNum
    movieName = []   #存储电影的名字信息
    for item in movieNamePre:
        movieName.append(item.get('title'))   #解析获取源代码中的电影名称
    u = zip(movieName,movieValue,movieNum)    #将电影名、电影评分、评论人数zip成一个元组
    #输出解析出的结果信息
    for name ,val ,num in u:
        print name
        print val
        print num
        print '----' * 10
ul = requreMovieLable(urls)     #获取主页面各个电影分类的url地址存取在列表中
page = 3        #设置下载网页列表的个数
firstUl = ul[0]  #爬取‘爱情’分类下的所有电影
for i in range(0,page):
    print '----------------第%d页的电影---------------' % i
    parsMovie(firstUl + '?start={}&type=T'.format(str(i*20)))

以下是程序的输出结果(只截取了部分):
这里写图片描述
这里写图片描述
这里写图片描述

初次写博客,希望大家批评指正!!
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3571次
    • 积分:78
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    文章分类
    文章存档
    最新评论