关于基本Beautiful Soup
的基本使用方法在前面都已经有介绍过了,Beautiful Soup
的点比较多,在项目中是如何使用Beautiful Soup
对抓取到的网页进行分析,并提取关键的字段,这篇文章的目的就在此。
经常看电影的同学都会关注电影的排行榜,在对电影的分析前,先得得到电影的数据。有很多的网站提供了对电影的排名,猫眼也有提供如下的数据:
先使用 requests
获取网页数据:
url = "http://maoyan.com/board/4?offset=0"
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0'
headers['Accept-Encoding'] = 'gzip, deflate'
headers['Content-Type'] = 'text/html; charset=utf-8'
maoyan_response = requests.get(url,headers=headers)
关于headers
是如何选取的,简单的方式是使用浏览器的调试,打开浏览器的web开发工具
选择网络
,重新刷下网站,找到http://maoyan.com/board/4?offset=0
的地址,查看网站的请求头。
假设我的项目中需要获取到电影的排名
,电影的名字
,电影的主演
,电影的上映时间
,电影的评分
。
使用浏览器自带的工具对网页进行分析,从页面来开,每一页中有10部电影,通常我们需要找到这10部电影的一个中标签,这个标签中包含着这10电影的代码。
好,我们找到了
使用Beautiful Soup
进行抓取,
pinyin_soup = BeautifulSoup(maoyan_response.text, "lxml")
board_wrapper_tag = pinyin_soup.find('dl',{'class':'board-wrapper'})
dl
中包含了10个的dd
,每个dd
里面包含着每一部电影的各种信息,解析dd
就能解析出我们需要的属性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOx3Dujc-1649318200034)(/images/kuxue/blog/movie_tags.png)]
board_dd_tags = board_wrapper_tag.select('dd')
for board_dd_tag in board_dd_tags:
print board_dd_tag.find('i',{'class':re.compile('board-index*')}).text.strip()
print board_dd_tag.find('p', {'class': 'name'}).find('a').text.strip()
print board_dd_tag.find('p', {'class': 'star'}).text.strip()
print board_dd_tag.find('p', {'class': 'releasetime'}).text.strip()
print board_dd_tag.find('p', {'class': 'score'}).text.strip()
通过dd
里的属性,解析出电影的排名
,电影的名字
,电影的主演
,电影的上映时间
,电影的评分
。
#!/usr/bin/python
#coding=utf-8
import requests
from bs4 import BeautifulSoup
import re
for i in range(0,10):
url = "http://maoyan.com/board/4?offset=%d"%(i*10)
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0'
headers['Accept-Encoding'] = 'gzip, deflate'
headers['Content-Type'] = 'text/html; charset=utf-8'
maoyan_response = requests.get(url,headers=headers)
if maoyan_response.status_code == 200:
pinyin_soup = BeautifulSoup(maoyan_response.text, "lxml")
board_wrapper_tag = pinyin_soup.find('dl',{'class':'board-wrapper'})
if board_wrapper_tag is not None:
board_dd_tags = board_wrapper_tag.select('dd')
for board_dd_tag in board_dd_tags:
print board_dd_tag.find('i',{'class':re.compile('board-index*')}).text.strip()
print board_dd_tag.find('p', {'class': 'name'}).find('a').text.strip()
print board_dd_tag.find('p', {'class': 'star'}).text.strip()
print board_dd_tag.find('p', {'class': 'releasetime'}).text.strip()
print board_dd_tag.find('p', {'class': 'score'}).text.strip()
print
输出结果为:
1
霸王别姬
主演:张国荣,张丰毅,巩俐
上映时间:1993-01-01(中国香港)
9.6
2
肖申克的救赎
主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿
上映时间:1994-10-14(美国)
9.5
…
我们默认了总的页数为10页,每一页是通过offset=
进行跳转,BeautifulSoup
中在查找属性是用的比较多的是find
和find_all
,select
也和find_all
有同样的用法,但是在查找的时候find
和find_all
配合起来,方便很多。