BeautifulSoup爬取豆瓣电影top250信息

豆瓣是一个社区网站,创立于2005年3月6日。该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站。
网址:https://movie.douban.com/top250?start=0&filter=
我将基于豆瓣电影top250讲解BeautifulSoup技术的爬虫,获取排名前250名的影片信息,包括(网站名称、豆瓣排名、中文名称、原名称、国家、上映时间、类型、评分、导演主演、评价人数、剧情简介链接、图片地址、影片标签)等。主要内容包括:分析网页DOM树结构,爬取豆瓣电影信息、分析链接跳转及爬取对应的信息。

1、分析网页结构及定位

1.1. 我们先导入相关的的包,获取网页并使用BeautifulSoup解析,代码如下:

# -*- coding: utf-8 -*-
import urllib2
from bs4 import BeautifulSoup

url = "https://movie.douban.com/top250"
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html,"html.parser")

print u'网站名称:',soup.title.string.replace("\n","")

1.2.把鼠标指在肖申克的救赎模块,右击选择检查,进行详细信息定位
在这里插入图片描述
把网页看作一个大盒子,这些信息都是一个一个的小盒子装着的,每一个电影的所有信息都装在<li> <li>中,在其中又分出很多的带属性标签,我们需要获取的内容全部在一个叫<div class="item"> </div>的标签中装着,如图所示:
在这里插入图片描述

只需要在class="item"中做迭代循环就可以获取到模块的所有信息,定位代码如下:

for tag in soup.find_all(attrs={"class":"item"}):

2、获取对应的信息

(1)豆瓣电影排名
电影排名被存在<em> </em>标签中,而且是在第一个em标签,方便直接获取
在这里插入图片描述
获取第一个em标签内容代码如下:

>>> print u'豆瓣排名:',tag.find('em').string
豆瓣排名: 1
>>> print u'豆瓣排名:',tag.find('em').get_text()
豆瓣排名: 1
>>> 

(2)获取电影中文名称
电影的中文名称和英文名称都在span标签中,但中文名称在第一个span标签
在这里插入图片描述
获取第一个span标签内容代码如下:

>>> print u'中文名称:',tag.find('span').string
中文名称: 肖申克的救赎
>>> print u'中文名称:',tag.find('span').get_text()
中文名称: 肖申克的救赎
>>> 

(2)获取电影原名称

  1. 通过第二个span标签找到它
  2. 通过split(’/’)[1]去掉“/”
>>> English = tag.find_all('span')[1].get_text()
>>> print u'原名称:',English
原名称:  / Intouchables
>>> 
>>> print u'原名称:',English.split('/')[1]
原名称:  Intouchables
>>> 

(3)获取国家

  1. 通过p标签查找所有内容
  2. 通过split(’/’)分割,“-”表示向后进行分割
>>> print u'国家:',tag.p.get_text()
国家: 
                            导演: 奥利维·那卡什 Olivier Nakache / 艾力克·托兰达 Eric Toledano   主...
                            2011 / 法国 / 剧情 喜剧
                        
>>> print u'国家:',tag.p.get_text().split('/')[-2]
国家:  法国 
>>> 

(4)上映时间

  1. 定点p标签内容
  2. 用split(’\n’)进行换行符定位截取
  3. 通过split(’/’)截取出时间
  4. 使用replace(" “,”")替换掉多余的空格
>>> print u'p标签内容:',tag.p.get_text()
p标签内容: 
                            导演: 奥利维·那卡什 Olivier Nakache / 艾力克·托兰达 Eric Toledano   主...
                            2011 / 法国 / 剧情 喜剧
                        
>>> print u'换行符定位:',tag.p.get_text().split('\n')[2]
换行符定位:                             2011 / 法国 / 剧情 喜剧
>>> print u'截取出时间:',tag.p.get_text().split('\n')[2].split('/')[0]
截取出时间:                             2011 
>>> print u'时间去掉空格:',tag.p.get_text().split('\n')[2].split('/')[0].replace(" ","")
时间去掉空格: 2011 
>>> 

(5)获取类型
在p标签中通过换行符(’\n’)和“/”进行截取,方法同上,代码片段如下:

>>> print u'类型:',tag.p.get_text().split('\n')[2].split('/')[-1]
类型:  剧情 喜剧
>>>

(6)获取电影评分
方法一: 直接获取第五个span标签的内容,代码片段如下:

>>> print u'评分:',tag.find_all('span')[4].get_text()
评分: 9.2
>>> 

方法二: 节点定位法,建议多使用它

>>> price = tag.find_all(attrs={"class":"rating_num" })
>>> sore = price[0].get_text()
>>> print u'评分:',sore
评分: 9.2
>>> 

(7)获取评论人数

  1. 通过span标签倒序截取出内容
  2. 使用正则表达式re.compile(r"\d+.?\d*")保留数字
>>> valuation = tag.find_all('span')[-2].get_text()
>>> print valuation
557877人评价
>>> regex = re.compile(r"\d+\.?\d*")#使用正则表达式保留数字
>>> print (regex.findall(valuation))
[u'557877']
>>> print u'评价人数:',(regex.findall(valuation))[0]
评价人数: 557877
>>> 

(8)获取导演及主演

  1. 获取p标签的后节点的内容
  2. 替换掉换行符和空格符
>>> print tag.p.next_element #p的后节点内容

                            导演: 奥利维·那卡什 Olivier Nakache / 艾力克·托兰达 Eric Toledano   主...
>>> print tag.p.next_element.replace("\n","").replace(" ","")
导演:奥利维·那卡什OlivierNakache/艾力克·托兰达EricToledano   主...
>>> 

(9)获取剧情简介链接
通过a标签的 href 直接找到

>>> print u'剧情简介:',tag.a.get('href')
剧情简介: https://movie.douban.com/subject/6786002/
>>> 

(10)图片地址链接
通过 img 标签的 src 直接找到

>>> print u'图片地址:',tag.img.get('src')
图片地址: https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1454261925.jpg
>>> 

(11)获取电影标签

  1. 获取HTML节点定位<span class="other">&nbsp;/&nbsp;/ 闪亮人生(港) / 逆转人生(台)</span>
  2. 提取文本
>>> lab = tag.find_all(attrs={"class":"other"})
>>> print lab[0]
<span class="other"> / 闪亮人生()  /  逆转人生()</span>

>>> lable = lab[0].get_text()
>>> print u'影片标签:',lable
影片标签:  / 闪亮人生()  /  逆转人生()
>>> 

3、实现链接跳转分析爬取

传参函数结构

def part(url):

if __name__ == '__main__':
	url = "http://www.ayouleyang.cn/"
	part(url)

实现新链接生成及传参代码如下:

# -*- coding: utf-8 -*-
import re
import urllib2
from bs4 import BeautifulSoup

#定位代码范围、爬虫部分
def part(url):
	#print需要输出的内容


#主函数,生成链接传参
if __name__ == '__main__':
    i = 0
    while i<10:
        print u'网页当前位置:',(i+1)
        num = i*25
        url = 'https://movie.douban.com/top250?start='+ str(num) +'&filter='
        part(url)
        i = i+1

4、完整的爬取代码和运行结果如下

# -*- coding: utf-8 -*-
import re
import urllib2
from bs4 import BeautifulSoup

urls = "https://movie.douban.com/top250"
html = urllib2.urlopen(urls).read()
soup = BeautifulSoup(html,"html.parser")

print u'网站名称:',soup.title.string.replace("\n","")

#定位代码范围、爬虫部分
def part(url):
    html = urllib2.urlopen(url).read()
    soup = BeautifulSoup(html,"html.parser")

    for tag in soup.find_all(attrs={"class":"item"}):
        print u'豆瓣排名:',tag.find('em').string
        print u'中文名称:',tag.find('span').string
        
        English = tag.find_all('span')[1].get_text()
        print u'原名称:',English.split('/')[1]
        
        print u'国家:',tag.p.get_text().split('/')[-2]    
        print u'上映时间:',tag.p.get_text().split('\n')[2].split('/')[0].replace(" ","")
        print u'类型:',tag.p.get_text().split('\n')[2].split('/')[-1]
        
        #电影评分
        #print tag.find_all('span')[4].get_text()      方法1
        price = tag.find_all(attrs={"class":"rating_num" })  #方法2
        sore = price[0].get_text()
        print u'评分:',sore

        #评价人数
        valuation = tag.find_all('span')[-2].get_text()
        regex = re.compile(r"\d+\.?\d*") #使用正则表达式保留数字
        print u'评价人数:',(regex.findall(valuation))[0]
        
        #导演及主演
        join = tag.p.next_element #p的后节点
        print join.replace("\n","").replace(" ","")

        print u'剧情简介:',tag.a.get('href')
        print u'图片地址:',tag.img.get('src')
        
        lab = tag.find_all(attrs={"class":"other"})
        lable = lab[0].get_text()
        print u'影片标签:',lable    
        print ""
if __name__ == '__main__':
    i = 0
    while i<10:
        print u'网页当前位置:',(i+1)
        num = i*25
        url = 'https://movie.douban.com/top250?start='+ str(num) +'&filter='
        part(url)
        i = i+1

在这里插入图片描述
在这里插入图片描述

  • 17
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,以下是一个简单的 Python 爬取豆瓣电影 TOP250 的程序: ```python import requests from bs4 import BeautifulSoup def get_html(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.36'} response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: return None def parse_html(html): soup = BeautifulSoup(html, 'lxml') movie_list = soup.find('ol', class_='grid_view').find_all('li') for movie in movie_list: # 电影排名 rank = movie.find('em').get_text() # 电影名称 title = movie.find('span', class_='title').get_text() # 电影评分 score = movie.find('span', class_='rating_num').get_text() # 电影评价人数 evaluate_num = movie.find('div', class_='star').find_all('span')[3].get_text() # 电影导演和演员信息 info = movie.find('p', class_='').get_text().strip() info_list = info.split('\n') director = info_list[0][4:].strip() actors = info_list[1][3:].strip() # 打印电影信息 print('排名:', rank) print('电影名称:', title) print('评分:', score) print('评价人数:', evaluate_num) print('导演:', director) print('演员:', actors) print('------------------------------------') def main(): url = 'https://movie.douban.com/top250' html = get_html(url) parse_html(html) if __name__ == '__main__': main() ``` 这个程序会爬取豆瓣电影 TOP250 的排名、电影名称、评分、评价人数、导演和演员信息,并打印出来。你可以根据需要对程序进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值