一、爬取豆瓣
1.引入库
import requests
from bs4 import BeautifulSoup
2.问题
import requests
# 发请求测试
response = requests.get('https://movie.douban.com/top250')
print(response)
状态码是418,意思是服务器拒绝了我们的请求。这是因为服务器没有识别到我们是用户端,所以为了保证网站数据的安全,将我们拒之门外。那么我们就需要对自己进行一些简单的伪装。
UA(user-agent)伪装,是我本次采用的伪装策略,也是最简单的伪装策略,有些网站的反爬机制比较复杂,则需要采用更加复杂的反反爬机制来进行伪装,不过,对于豆瓣来说,UA伪装就够用了。
3.爬取数据
if __name__ == '__main__':
url = 'https://movie.douban.com/chart'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'}
strhtml = requests.get(url, headers=headers) # Get方式获取网页数据
#print(strhtml.text)
soup = BeautifulSoup(strhtml.text, 'html.parser')
movie_items = soup.find_all('div', class_='pl2')
i=1
for item in movie_items:
# .select_one('.title') 是一个方法调用,用于查找并返回item节点下的首个匹配CSS选择器.title的元素
title = item.select('.pl2 a')[0].text.replace(' ', '').replace('\n','')
#print(title)
performer = item.select('.pl2 p')[0].text.replace(' ', '').replace('\n','')
#print(performer)
try:
rate_num = item.select_one('.rating_nums').text.replace('\n','')
except Exception as e:
rate_num = 'No Rate Num'
# .select('.bd p') 使用BeautifulSoup库中的CSS选择器选取了属于item后代的所有类名为bd的元素下的所有<p>元素。
# [0] 用于获取这些<p>元素中的第一个元素的文本内容,即第一个段落。
#data = item.select('.bd p')[0].text.split('\n')
print(str(i) + ': ' + title + ',' + performer + ',' + rate_num)
i+=1
4.top250
def top250_crawer(url,sum):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'}
strhtml = requests.get(url, headers=headers) # Get方式获取网页数据
soup = BeautifulSoup(strhtml.text, 'html.parser')
#找到所有class为'item'的div元素
'''
< 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>
3001169人评价
< /span>
</div>
<p class="quote">
<span class="inq">
希望让人自由。
< /span>
</p>
</div>
</div>
</div>
'''
movie_items = soup.find_all('div', class_='item')
i = sum+1
for item in movie_items:
#.select_one('.title') 是一个方法调用,用于查找并返回item节点下的首个匹配CSS选择器.title的元素
title = item.select_one('.title').text
#print(title)
rating = item.select_one('.rating_num').text
#.select('.bd p') 使用BeautifulSoup库中的CSS选择器选取了属于item后代的所有类名为bd的元素下的所有<p>元素。
#[0] 用于获取这些<p>元素中的第一个元素的文本内容,即第一个段落。
data = item.select('.bd p')[0].text.split('\n')
#data[2].replace(' ', '') 是去掉字符串中所有空格的操作,使得 / 分隔符两侧没有干扰的空格。split('/') 以 / 为分隔符,将字符串分割成子字符串组成的列表。
time = data[2].replace(' ', '').split('/')[0]
country = data[2].replace(' ', '').split('/')[1]
type_of = data[2].replace(' ', '').split('/')[2]
print(str(i) + '.' + title + ',' + country + ',' + time+','+type_of)
i+=1
if __name__ == '__main__':
url = 'https://movie.douban.com/top250'
sum = 0
'遍历10页数据,250条结果'
for a in range(10):
if sum == 0:
top250_crawer(url, sum)
sum += 25
else:
page = '?start=' + str(sum) + '&filter='
new_url = url + page
top250_crawer(new_url, sum)
sum += 25
分析一下这段HTML,仅以第一个片段为例:
< 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>
3001169人评价
< /span>
</div>
<p class="quote">
<span class="inq">
希望让人自由。
< /span>
</p>
</div>
</div>
</div>
这段HTML代码片段描绘了一个典型的电影信息展示单元,其中包括电影海报、基本信息、评分以及简短的引述。以下是详细的解读:
-
整个电影项目被包裹在一个带有
class="item"
的<div>
标签内,表示这是一个电影列表中的一个单独项目。 -
电影海报区域:
<div class="pic">
包含了电影的海报图像和其他辅助信息。<em>
标签可能用于展示电影在列表中的排序(此处为数字“1”)。<a>
标签包围了电影海报,指向电影详情页面,URL为"https://movie.douban.com/subject/1292052/"。<img>
标签嵌入了电影海报的图片,源地址为"https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg",宽度为100像素。
-
电影基本信息区域:
<div class="info">
包含电影的标题、导演、主演、年份、地区、类型以及评分等信息。<div class="hd">
中包含了电影标题相关信息:- 电影的中文标题、英文原名以及其他地区的译名,分别由多个
<span>
标签承载。 [可播放]
表示该电影在网站上有播放资源。
- 电影的中文标题、英文原名以及其他地区的译名,分别由多个
-
详细信息区域:
<div class="bd">
包含了电影的导演、主演、上映年份及地区、类型等详细信息。- 显示了导演名字、主演名单(这里省略了部分信息)、电影上映的年份(1994年)、国家(美国)和类型(犯罪、剧情)。
- 接下来是一个评级区域,包含了电影的平均评分(9.7分)和评价人数(3001169人)。
- 最后是一个简短的电影引述,即一句电影经典台词:“希望让人自由”。
总的来说,这段HTML代码用于在网页上呈现一个标准化的电影项目卡,提供了观众快速浏览电影基本信息所需的各项内容。