完整代码如下:
import requests
from bs4 import BeautifulSoup
for i in range(10):
res = requests.get("https://movie.douban.com/top250?start=" + str(i * 25)) # 发送get请求
html = res.text#将获取到的网页信息以字符串的形式存入变量html中
soup = BeautifulSoup(html, "html.parser")#用BeautifulSoup将网页信息html解析成人们看得懂的语言,解释器是html.parser
items = soup.find_all("div", class_="item")#提取所有的电影名,序号,链接,推荐语,评分的数据
for item in items:
dym_0 = item.find("span", class_="title") # 标签包含电影名
dym_1 = dym_0.text # 去掉标签,提取电影名
xh_0 = item.find("em", class_="")# 标签包含序号
xh_1 = xh_0.text
pf_0 = item.find("span", class_="rating_num")# 标签包含评分
pf_1 = pf_0.text
print(xh_1,dym_1, pf_1)#打印序号,电影名,评分
tjy_0 = item.find("span",class_ = "inq")# 标签包含推荐语
if tjy_0:#打印非空的推荐语,否则报错
print(tjy_0.text)
lj_0 = item.find("a")
print(lj_0['href'] + "\n")#提取lj_0["a"]属性的值。即 将 <a href="网址">中,属性a的值href提取出来并打印。
步骤一:网站分析
进入网页:https://movie.douban.com/top250,如图所示:
第一页只有25个电影,如果想要获取所有的250页的电影,就需要获取总共10页的内容。(重复获取的工作交给for循环)
通过单击第二页可以发现网页的地址变成:
https://movie.douban.com/top250?start=25&filter=
第三页地址为:
https://movie.douban.com/top250?start=50&filter=
比较
第二页可以发现网页的地址:
https://movie.douban.com/top250?start=25&filter=
这就很容易理解了,每多一页,就给网页地址的start加25。
通过上述分析发现,可以使用requests获取电影网页的代码,并利用for循环翻页。代码如下:
for i in range(10):
res = requests.get("https://movie.douban.com/top250?start=" + str(i * 25)) # 发送get请求
html = res.text#将获取到的网页信息以字符串的形式存入变量html中
我们用requests.get()来获取数据,
接着用BeautifulSoup解析数据和提取数据,添加代码如下:
for i in range(10):
res = requests.get("https://movie.douban.com/top250?start=" + str(i * 25)) # 发送get请求
html = res.text#将获取到的网页信息以字符串的形式存入变量html中
soup = BeautifulSoup(html, "html.parser")#用BeautifulSoup将网页信息html解析成人们看得懂的语言,解释器是html.parser
items = soup.find_all("div", class_="item")#提取所有的电影名,序号,链接,推荐语,评分的数据
提取最小父级标签
先右击检查,进入以下界面:
它的标签是
,有一个class属性,其值是info pure-u。我们可以使用find_all()语法,来找到它们。
再右击网页源代码,进入以下界面:
接着你要记住一句话:
标签,里面会有我们想要的信息
接着我们对父级标签,使用find_all()方法来查找所有想要的标签就对了,还要将标签的文本内容提取出来,用 标签名.text的方法提取标签中的文字,再接着打印文字(包括链接),代码如下:
for item in items:
dym_0 = item.find("span", class_="title") # 标签包含电影名
dym_1 = dym_0.text # 去掉标签,提取电影名
xh_0 = item.find("em", class_="")# 标签包含序号
xh_1 = xh_0.text
pf_0 = item.find("span", class_="rating_num")# 标签包含评分
pf_1 = pf_0.text
print(xh_1,dym_1, pf_1)#打印序号,电影名,评分
tjy_0 = item.find("span",class_ = "inq")# 标签包含推荐语
if tjy_0:#打印非空的推荐语,否则报错
print(tjy_0.text)
lj_0 = item.find("a")
print(lj_0['href'] + "\n")#提取lj_0["a"]属性的值。即 将 <a href="网址">中,属性a的值href提取出来并打印。
多说一句:为什么会有这个语句?注释一下来看看报错:
if tjy_0:#打印非空的推荐语,否则报错
print(tjy_0.text)
因为以下报错:
AttributeError: 'NoneType' object has no attribute 'text'
NoneType是一个都没有类型的文本,即文本为空,不能用 .text的方法。解决方法就是:
对文本进行判断:当我的文本里有内容就打印,否则就不打印。用if语句就可以解决。
结语:多动手,多试错,多入坑,练多了你就熟练掌握了。一起加油!