300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 爬虫实战TOP250电影数据(Requests和BeautifulSoup )

爬虫实战TOP250电影数据(Requests和BeautifulSoup )

时间:2019-11-19 18:54:08

相关推荐

爬虫实战TOP250电影数据(Requests和BeautifulSoup )

完整代码如下:

import requestsfrom bs4 import BeautifulSoupfor i in range(10):res = requests.get("/top250?start=" + str(i * 25)) # 发送get请求html = res.text#将获取到的网页信息以字符串的形式存入变量html中soup = BeautifulSoup(html, "html.parser")#用BeautifulSoup将网页信息html解析成人们看得懂的语言,解释器是html.parseritems = 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.textpf_0 = item.find("span", class_="rating_num")# 标签包含评分pf_1 = pf_0.textprint(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提取出来并打印。

步骤一:网站分析

进入网页:/top250,如图所示:

第一页只有25个电影,如果想要获取所有的250页的电影,就需要获取总共10页的内容。(重复获取的工作交给for循环

通过单击第二页可以发现网页的地址变成:

/top250?start=25&filter=

第三页地址为:

/top250?start=50&filter=

比较

第二页可以发现网页的地址:

/top250?start=25&filter=

这就很容易理解了,每多一页,就给网页地址的start加25。

通过上述分析发现,可以使用requests获取电影网页的代码,并利用for循环翻页。代码如下:

for i in range(10):res = requests.get("/top250?start=" + str(i * 25)) # 发送get请求html = res.text#将获取到的网页信息以字符串的形式存入变量html中

我们用requests.get()来获取数据,

接着用BeautifulSoup解析数据和提取数据,添加代码如下:

for i in range(10):res = requests.get("/top250?start=" + str(i * 25)) # 发送get请求html = res.text#将获取到的网页信息以字符串的形式存入变量html中soup = BeautifulSoup(html, "html.parser")#用BeautifulSoup将网页信息html解析成人们看得懂的语言,解释器是html.parseritems = 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.textpf_0 = item.find("span", class_="rating_num")# 标签包含评分pf_1 = pf_0.textprint(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语句就可以解决。

结语:多动手,多试错,多入坑,练多了你就熟练掌握了。一起加油!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。