注:本文章为学习过程中对知识点的记录,供自己复习使用,也给大家做个参考,如有错误,麻烦指出,大家共同探讨,互相进步。
借鉴出处:
该文章的路线和主要内容:崔庆才(第2版)python3网络爬虫开发实战
爬取目标: https://spa1.scrape.center
1、电影的名称、封面、类别、上映日期、评分、剧情简介等信息。
2、用requests实现Ajax数据的爬取
3、对爬取的数据进行存储
分析:
首先:我们要获取电影的名称、封面、类别、上映日期、评分、剧情简介等信息在每一首电影的详情接口可以获取,所以只要搜集所有的电影的详情页即可爬取所有电影的信息。
对详情页接口进行分析,每个url后缀传入了一个数字,分析而知是每部电影的id且所有电影的id都是不同的,那就要找所有的id。
其次:对每一页接口分析而知,响应中包含当前页所有电影的id,那对所有页遍历完之后就可以获取全部的id了。
最后:将每部电影数据存储到json文件中,要将dict转换为json对象后,以追加的方式存入bb.json文件中即可。
输入:
import requests
import json
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s : %(message)s')
BASE_URL = 'https://spa1.scrape.center/api/movie?limit={limit}&offset={offset}'
INDEX_URl = 'https://spa1.scrape.center/api/movie/{id}/'
'''通用爬取方法'''
def scrape_method(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
logging.error(f"请求{url}的状态码:{requests.status_codes}")
except requests.RequestException as e:
logging.error(e)
'''爬取每一页的url'''
def scrape_baseUrl(limitA,offsetA):
url = BASE_URL.format(limit=limitA,offset=offsetA)
return scrape_method(url)
'''爬取每一个电影'''
def scrape_indexRul(id):
url = INDEX_URl.format(id = id)
return scrape_method(url)
def main():
limitNum = 10
# 一共11页offset依次传入0 10 20 .... 100
for i in range(0,100,10):
jsonObject = scrape_baseUrl(limitNum,i)
logging.info(jsonObject.get('results'))
# 此时results是dict类型,需要转换为json对象,再存入json文件
for item in jsonObject.get('results'):
id = item.get('id')
indexData = scrape_indexRul(id)
# 以追加的方式将每一部电影的所有属性都存入到bb.json文件中
with open('bb.json', 'a', encoding='utf-8') as file:
file.write(json.dumps(indexData, indent=2, ensure_ascii=False))
file.write('\n')
if __name__ == '__main__':
main()
输出: