「2022 年」崔庆才 Python3 爬虫教程 - 基础案例爬取实战( 四 )
最后,上述的字段提取完毕之后,构造一个字典返回即可 。
这样,我们就成功完成了详情页的提取和分析了 。
最后,main 方法稍微改写一下,增加这两个方法的调用,改写如下:
def main(): for page in range(1, TOTAL_PAGE + 1): index_html = scrape_index(page) detail_urls = parse_index(index_html) for detail_url in detail_urls: detail_html = scrape_detail(detail_url) data = https://www.08ts.cn/parse_detail(detail_html) logging.info('get detail data %s', data)
这里我们首先遍历了 detail_urls,获取了每个详情页的 URL,然后依次调用了 scrape_detail 和 parse_detail 方法,最后得到了每个详情页的提取结果,赋值为 data 并输出 。
运行结果如下:
2020-03-08 23:37:35,936 - INFO: scraping https://ssr1.scrape.center/page/1...2020-03-08 23:37:36,833 - INFO: get detail url https://ssr1.scrape.center/detail/12020-03-08 23:37:36,833 - INFO: scraping https://ssr1.scrape.center/detail/1...2020-03-08 23:37:39,985 - INFO: get detail data {'cover': 'https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c', 'name': '霸王别姬 - Farewell My Concubine', 'categories': ['剧情', '爱情'], 'published_at': '1993-07-26', 'drama': '影片借一出《霸王别姬》的京戏,牵扯出三个人之间一段随时代风云变幻的爱恨情仇 。段小楼(张丰毅 饰)与程蝶衣(张国荣 饰)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉满京城,为此,两人约定合演一辈子《霸王别姬》 。但两人对戏剧与人生关系的理解有本质不同,段小楼深知戏非人生,程蝶衣则是人戏不分 。段小楼在认为该成家立业之时迎娶了名妓菊仙(巩俐 饰),致使程蝶衣认定菊仙是可耻的第三者,使段小楼做了叛徒,自此,三人围绕一出《霸王别姬》生出的爱恨情仇战开始随着时代风云的变迁不断升级,终酿成悲剧 。', 'score': 9.5}2020-03-08 23:37:39,985 - INFO: get detail url https://ssr1.scrape.center/detail/22020-03-08 23:37:39,985 - INFO: scraping https://ssr1.scrape.center/detail/2...2020-03-08 23:37:41,061 - INFO: get detail data {'cover': 'https://p1.meituan.net/movie/6bea9af4524dfbd0b668eaa7e187c3df767253.jpg@464w_644h_1e_1c', 'name': '这个杀手不太冷 - Léon', 'categories': ['剧情', '动作', '犯罪'], 'published_at': '1994-09-14', 'drama': '里昂(让·雷诺 饰)是名孤独的职业杀手,受人雇佣 。一天,邻居家小姑娘马蒂尔德(纳塔丽·波特曼 饰)敲开他的房门,要求在他那里暂避杀身之祸 。原来邻居家的主人是警方缉毒组的眼线,只因贪污了一小包毒品而遭恶警(加里·奥德曼 饰)杀害全家的惩罚 。马蒂尔德 得到里昂的留救,幸免于难,并留在里昂那里 。里昂教小女孩使枪,她教里昂法文,两人关系日趋亲密,相处融洽 。女孩想着去报仇,反倒被抓,里昂及时赶到,将女孩救回 。混杂着哀怨情仇的正邪之战渐次升级,更大的冲突在所难免……', 'score': 9.5}2020-03-08 23:37:41,062 - INFO: get detail url https://ssr1.scrape.center/detail/3...
由于内容较多,这里省略了后续内容 。
可以看到,这里我们就成功提取出来了每部电影的基本信息了,包括封面、名称、类别等等 。
5. 保存数据
好,成功提取到详情页信息之后,我们下一步就要把数据保存起来了 。由于我们到现在我们还没有学习数据库的存储,所以现在我们临时先将数据保存成文本格式,在这里我们可以一个条目一个 JSON 文本 。
定义保存数据的方法如下:
import jsonfrom os import makedirsfrom os.path import existsRESULTS_DIR = 'results'exists(RESULTS_DIR) or makedirs(RESULTS_DIR)def save_data(data): name = data.get('name') data_path = f'{RESULTS_DIR}/{name}.json' json.dump(data, open(data_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=2)
在这里我们首先定义了数据保存的文件夹 RESULTS_DIR,然后判断了下这个文件夹是否存在,如果不存在则创建 。
接着,我们定义了保存数据的方法 save_data,首先我们获取了数据的 name 字段,即电影的名称,我们将电影的名称当做 JSON 文件的名称,接着构造了 JSON 文件的路径,然后用 json 的 dump 方法将数据保存成文本格式 。在 dump 的方法设置了两个参数,一个是 ensure_ascii 设置为 False,可以保证的中文字符在文件中能以正常的中文文本呈现,而不是 unicode 字符;另一个 indent 为 2,则是设置了 JSON 数据的结果有两行缩进,让 JSON 数据的格式显得更加美观 。
好的,那么接下来 main 方法稍微改写一下就好了,改写如下:
def main(): for page in range(1, TOTAL_PAGE + 1): index_html = scrape_index(page) detail_urls = parse_index(index_html) for detail_url in detail_urls: detail_html = scrape_detail(detail_url) data = https://www.08ts.cn/parse_detail(detail_html) logging.info('get detail data %s', data) logging.info('saving data to json file') save_data(data) logging.info('data saved successfully')
推荐阅读
- 旅游|神十四乘组将第二次出舱!2025年中国有望开启太空旅行:票价200-300万元
- 陈意涵|儿上学爆哭「跟在我后面」,陈意涵跑步追娃娃车!崩溃画面笑翻网友
- 退休年龄|退休年龄60周岁,但为什么很多企业过了45岁就不要了呢?
- 「中国星空人物」杨友利:就这样坠入星空梦境
- 陈宝国|1995年,陈宝国拍《大宅门》,直接拿9万巨款拍桌上:没他我不拍
- 王诗龄|为什么女人上了年纪后,素颜更好看,化妆却反而显老?原因很简单
- 小鬼|小鬼离世2周年!他生前女友裙裙发文表达对他的思念
- |8年后,文章终于低下了头
- 成毅|成毅:出道11年,主演4部电视剧,豆瓣平均分只有5.8
- 曾仕强预言2025年不要去上海 预言2025年不要去上海了
