python 豆瓣排行榜


一、爬取豆瓣

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代码片段描绘了一个典型的电影信息展示单元,其中包括电影海报、基本信息、评分以及简短的引述。以下是详细的解读:

  1. 整个电影项目被包裹在一个带有class="item"<div>标签内,表示这是一个电影列表中的一个单独项目。

  2. 电影海报区域

    • <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像素。
  3. 电影基本信息区域

    • <div class="info"> 包含电影的标题、导演、主演、年份、地区、类型以及评分等信息。
    • <div class="hd"> 中包含了电影标题相关信息:
      • 电影的中文标题、英文原名以及其他地区的译名,分别由多个<span>标签承载。
      • [可播放] 表示该电影在网站上有播放资源。
  4. 详细信息区域

    • <div class="bd"> 包含了电影的导演、主演、上映年份及地区、类型等详细信息。
    • 显示了导演名字、主演名单(这里省略了部分信息)、电影上映的年份(1994年)、国家(美国)和类型(犯罪、剧情)。
    • 接下来是一个评级区域,包含了电影的平均评分(9.7分)和评价人数(3001169人)。
    • 最后是一个简短的电影引述,即一句电影经典台词:“希望让人自由”。

总的来说,这段HTML代码用于在网页上呈现一个标准化的电影项目卡,提供了观众快速浏览电影基本信息所需的各项内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值