2020.7.31爬取豆瓣热门电影(Ajax)

首先打开豆瓣地址:(https://movie.douban.com/)
点击更多
在这里插入图片描述
打开开发者工具F12 或者 右键点击检查
点击Network下的XHR
可以看到当电影页面往下拉点击加载更多的时候XHR会更新出更多信息
至此可以判断此页面用的是Ajax请求
在这里插入图片描述
接下来我们点击第一个search_subjects?再点击Preview查看返回的内容
可以看到这就是我们要找的内容
其中包含了电影评分,电影名,电影地址,以及电影图片的地址
在这里插入图片描述
接下来分析每个search_subjects?地址上的不同

点击第二个search_subjects?发现除了page_start以每次加20来构造下一个地址外,其他都一样在这里插入图片描述
我们就可以用这个规律来爬取所有的热门电影信息啦

接下来附上代码
本次爬虫需要用到的库
tqdm用于实现进度条的显示

import requests
import time
from tqdm import tqdm

此函数用于请求网址,返回json格式的信息

def get_page(base_url):
	headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 SLBrowser/6.0.1.6181'}

	response = requests.get(base_url,headers=headers)
	if response.status_code == 200 :
		return response.json()
	else:
		print('Error')

将返回的json文本进行解析提取

def get_images(json):
	if json.get('subjects'):
		for item in json.get('subjects'):
			#评分
			rate = item.get('rate')
			#电影名
			title = item.get('title')
			#电影地址
			url = item.get('url')
			#图片地址
			cover = item.get('cover')
			#用生成器保存为列表包围字典
			yield{
				'rate':rate,
				'title':title,
				'url':url,
				'cover':cover
			}

用于保存信息的函数

def save_images(item):
	response = requests.get(item.get('cover'))
	#将电影名做为图片名保存在D盘
	if response.status_code == 200:
		file_path = '{0}{1}.{2}'.format('D:\\',str(item.get('title')),'jpg')
	try:
		with open(file_path,'wb') as f:
			f.write(response.content)
	except:
		return '无法保存:' + item.get('title')

最后实现代码的关键

url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start='

if __name__ == '__main__':
	number = 10
	#使用tqdm进度条显示 
	#循环10次
	for i in tqdm(range(number)):
		#网址加上每次i*20
		base_url = url + str(20*i)
		#对内容进行解析
		json = get_page(base_url)
		#对保存的信息进行循环
		#每次循环都用保存函数进行保存
		for item in get_images(json):
			save_images(item)
		#2秒请求一个网址
		time.sleep(2)

总代码

import requests
from urllib.parse import urlencode
import time
from tqdm import tqdm


def get_page(base_url):
	headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 SLBrowser/6.0.1.6181'}

	response = requests.get(base_url,headers=headers)
	if response.status_code == 200 :
		return response.json()
	else:
		print('Error')

def get_images(json):
	if json.get('subjects'):
		for item in json.get('subjects'):
			#评分
			rate = item.get('rate')
			#电影名
			title = item.get('title')
			#电影地址
			url = item.get('url')
			#图片地址
			cover = item.get('cover')
			#用生成器保存为列表包围字典
			yield{
				'rate':rate,
				'title':title,
				'url':url,
				'cover':cover
			}

def save_images(item):
	response = requests.get(item.get('cover'))
	#将电影名做为图片名保存在D盘
	if response.status_code == 200:
		file_path = '{0}{1}.{2}'.format('D:\\',str(item.get('title')),'jpg')
	try:
		with open(file_path,'wb') as f:
			f.write(response.content)
	except:
		return '无法保存:' + item.get('title')


url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start='

if __name__ == '__main__':
	number = 10
	#使用tqdm进度条显示 
	for i in tqdm(range(number)):
		#请求网站地址
		base_url = url + str(20*i)
		#对内容进行解析
		json = get_page(base_url)
		#对解析的内容进行保存
		for item in get_images(json):
			save_images(item)
		#2秒请求一个网址
		time.sleep(2)

运行结果
在这里插入图片描述
可以看到图片都被抓取了下来
此次爬取我只显示了图片
其他的比如评分,以及电影的地址,都可以用数据库来保存。

到此就结束了,我还是个小白,希望在爬虫的路上大家可以一起进步,加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值