首先打开豆瓣地址:(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)
运行结果
可以看到图片都被抓取了下来
此次爬取我只显示了图片
其他的比如评分,以及电影的地址,都可以用数据库来保存。
到此就结束了,我还是个小白,希望在爬虫的路上大家可以一起进步,加油!!