第一步:分析问题,明确结果
问题需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下来,结果就是全部展示打印出来
第二步:思考要用到的知识
接下来我们一起分析网页吧~
进入首页 https://movie.douban.com/top250?start=0&filter= ,打开检查工具,在Elements里查看这个网页,是什么结构。点击开发者工具左上角的小箭头,选中“肖申克的救赎”,这样就定位了电影名的所在位置,审查元素中显示:标签内的文本,class属性;推荐语和评分也是如此,,
我们再换个电影验证下找的规律是否正确。
check后,我们再看一共10页,每页的url有什么相关呢?
第1页:https://movie.douban.com/top250?start=0&filter=
第3页:https://movie.douban.com/top250?start=50&filter=
第7页:https://movie.douban.com/top250?start=150&filter=
发现只有start后面是有变化哒,规律就是第N页,start=(N-1)*25
基于以上分析,我们有两种写爬虫的思路。
思路一:先爬取最小共同父级标签
思路二:分别提取所有的序号/所有的电影名/所有的评分/所有的推荐语/所有的链接,然后再按顺序一一对应起来。
第三步:书写思路一代码
先爬取最小共同父级标签
注:下方代码仅为思路提示,并非参考答案。
import requests, random, bs4
for x in range(10):
url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='
res = requests.get(url)
bs = bs4.BeautifulSoup(res.text, 'html.parser')
bs = bs.find('ol', class_="grid_view")
for titles in bs.find_all('li'):
num = titles.find('em',class_="").text
#查找序号
title = titles.find('span', class_="title").text
#查找电影名
tes = titles.find('span',class_="inq").text
#查找推荐语
comment = titles.find('span',class_="rating_num").text
#查找评分
url_movie = titles.find('a')['href']
print(num + '.' + title + '——' + comment + '\n' + '推荐语:' + tes +'\n' + url_movie)
9 num = titles.find('em',class_="").text
10 title = titles.find('span', class_="title").text
---> 11 tes = titles.find('span',class_="inq").text
12 comment = titles.find('span',class_="rating_num").text
13 url_movie = titles.find('a')['href']
AttributeError: 'NoneType' object has no attribute 'text'
看下报错信息“AttributeError: ‘NoneType’ object has no attribute ‘text’ ” ,定位到了tes这一行,这是推荐语呀,为什么会错呢? 我们回归网页,发现第223个电影是《三块广告牌》,诶,它竟然没有推荐语,而空值是没办法做text文本转换的,因此报错了呢。
那怎么解决呢,聪明的你一定想到啦~ Bingo,加一个判断就可以啦~
修改过代码,我们再试一下哦~
第四步:书写思路二代码
分别提取所有的序号/所有的电影名/所有的评分/所有的推荐语/所有的链接,然后再按顺序一一对应起来。