本章只是本人自己为了防止遗忘而巩固的beautifulSope的几个基本且试用的方法,爬取豆瓣top250的第一条电影,相信各位小可爱如果想,通过两个循环就可以获取到250部电影的所有信息。同时如果各位有何所指教也欢迎各位提出。(本章知识细节点并不详细,更多是为了实用性)
安装BeautifulSoup方法:
pip install beautilfulsoup4
创建对象:
from bs4 import BeautifulSoup
模拟 浏览器访问,增加头部,使用request方法无法直接get获取到网页源代码,所以使用urllib
(本次爬取页面为豆瓣top250的第一页,循环后9页等没有添加)
from urllib.request import Request,urlopen
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
url = "https://movie.douban.com/top250?start=0&filter="
req_obj = Request(url,headers=ua_header)
title = urlopen(req_obj).read().decode("utf-8")
title则为获取下来的网页源代码。
通过解析库可以发现lxml解析器是最适合最快速的。
soup = BeautifulSoup(title,'lxml')
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 |
| Python的内置标准库、执行速度适中、文档容错能力强 | Python 2.7.3及Python 3.2.2之前的版本文档容错能力差 |
lxml HTML解析器 |
| 速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析器 |
| 速度快、唯一支持XML的解析器 | 需要安装C语言库 |
html5lib |
| 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢、不依赖外部扩展 |
类型:
print(type(soup))
print(type(movie))
结果:
<class 'bs4.BeautifulSoup'>
<class 'bs4.element.Tag'>
网页源代码前一部分:
<!DOCTYPE html>
<html class="ua-windows ua-ie9" lang="zh-cmn-Hans">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="webkit" name="renderer"/>
<meta content="always" name="referrer"/>
<meta content="ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw" name="google-site-verification"/>
<title>
豆瓣电影 Top 250
</title>
......
运行
#只会获取soup源码中第一个title标签的源码,
print(soup.title)
#与print(soup.find('title))效果相同
#只会获取soup源码中第一个title标签的源码的文本内容
print(soup.title.string)
#与print(soup.find('title).string)效果相同
结果
<title>
豆瓣电影 Top 250
</title>
豆瓣电影 Top 250
而我们现在需要网页源代码中div的class为item的所有div。
所以:
#find只能获取第一个标签,若想获取多个标签或根据class进行获取则需要使用find_all
#获取soup中所有class为item的div
#因为数量过多目前只想取第一条数据,所以[0]
movie = soup.find_all('div',class_='item')[0]
#打印第一条class为item的div
print(movie)
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/>
</a>
</div>
<div class="info">
<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br/>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.7</span>
<span content="10.0" property="v:best"></span>
<span>1743954人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
主要获取以下几条数据:top、电影名称、电影英文名称、电影封面截图地址、电影影评
#top:第一个em标签里的文本内容
top = movie.find('em').string
#电影中文名称:movie中第一个span标签的文本内容
name = movie.find('span').string
#电影外文名称:movie中第二个class为title的span标签的文本内容,字符串取第三个值到结尾
englishName = movie.find_all('span',class_='title')[1].string[2:]
#电影封面截图地址:movie中第一个img标签的src属性
imgSrc = movie.img['src']
#电影影评:movie中第一个class为ing的span标签,转换为字符串取第一个值到倒数第二个值
movieReviews = movie.find_all('span',class_='inq')[0].string[:-1]
运行结果:
print("top:"+top+" name:"+name+" englishName:"+englishName+" imgSrc:"+imgSrc+" movieReviews:"+movieReviews)
top:1 name:肖申克的救赎 englishName: The Shawshank Redemption imgSrc:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg movieReviews:希望让人自由
源码(只获取并输出了豆瓣top250第一个电影的各种值):
from bs4 import BeautifulSoup
from urllib.request import Request,urlopen
# 头部
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
url = "https://movie.douban.com/top250?start=0&filter="
req_obj = Request(url,headers=ua_header)
title = urlopen(req_obj).read().decode("utf-8")
soup = BeautifulSoup(title,'lxml')
print(type(soup))
movie = soup.find_all('div',class_='item')[0]
print(type(movie))
top = movie.find('em').string
name = movie.find('span').string
englishName = movie.find_all('span',class_='title')[1].string[2:]
imgSrc = movie.img['src']
movieReviews = movie.find_all('span',class_='inq')[0].string[:-1]
print("top:"+top+" name:"+name+" englishName:"+englishName+" imgSrc:"+imgSrc+" movieReviews:"+movieReviews)
<clss....Tag>对象可使用str(...)转换成字符串
各位如果有相关问题也可以加我qq:1875319982