这里就是加了 save_data 方法的调用,并加了一些日志信息 。
重新运行,我们看下输出结果:
2020-03-09 01:10:27,094 - INFO: scraping https://ssr1.scrape.center/page/1...2020-03-09 01:10:28,019 - INFO: get detail url https://ssr1.scrape.center/detail/12020-03-09 01:10:28,019 - INFO: scraping https://ssr1.scrape.center/detail/1...2020-03-09 01:10:29,183 - INFO: get detail data {\'cover\': \'https://img.fajihao.com/article/2022/09/17/1490.jpg@464w_644h_1e_1c\', \'name\': \'霸王别姬 - Farewell My Concubine\', \'categories\': [\'剧情\', \'爱情\'], \'published_at\': \'1993-07-26\', \'drama\': \'影片借一出《霸王别姬》的京戏,牵扯出三个人之间一段随时代风云变幻的爱恨情仇 。段小楼(张丰毅 饰)与程蝶衣(张国荣 饰)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉满京城,为此,两人约定合演一辈子《霸王别姬》 。但两人对戏剧与人生关系的理解有本质不同,段小楼深知戏非人生,程蝶衣则是人戏不分 。段小楼在认为该成家立业之时迎娶了名妓菊仙(巩俐 饰),致使程蝶衣认定菊仙是可耻的第三者,使段小楼做了叛徒,自此,三人围绕一出《霸王别姬》生出的爱恨情仇战开始随着时代风云的变迁不断升级,终酿成悲剧 。\', \'score\': 9.5}2020-03-09 01:10:29,183 - INFO: saving data to json file2020-03-09 01:10:29,288 - INFO: data saved successfully2020-03-09 01:10:29,288 - INFO: get detail url https://ssr1.scrape.center/detail/22020-03-09 01:10:29,288 - INFO: scraping https://ssr1.scrape.center/detail/2...2020-03-09 01:10:30,250 - INFO: get detail data {\'cover\': \'https://img.fajihao.com/article/2022/09/17/1491.jpg@464w_644h_1e_1c\', \'name\': \'这个杀手不太冷 - Léon\', \'categories\': [\'剧情\', \'动作\', \'犯罪\'], \'published_at\': \'1994-09-14\', \'drama\': \'里昂(让·雷诺 饰)是名孤独的职业杀手,受人雇佣 。一天,邻居家小姑娘马蒂尔德(纳塔丽·波特曼 饰)敲开他的房门,要求在他那里暂避杀身之祸 。原来邻居家的主人是警方缉毒组的眼线,只因贪污了一小包毒品而遭恶警(加里·奥德曼 饰)杀害全家的惩罚 。马蒂尔德 得到里昂的留救,幸免于难,并留在里昂那里 。里昂教小女孩使枪,她教里昂法文,两人关系日趋亲密,相处融洽 。女孩想着去报仇,反倒被抓,里昂及时赶到,将女孩救回 。混杂着哀怨情仇的正邪之战渐次升级,更大的冲突在所难免……\', \'score\': 9.5}2020-03-09 01:10:30,250 - INFO: saving data to json file2020-03-09 01:10:30,253 - INFO: data saved successfully...
通过运行结果可以发现,这里成功输出了将数据存储到 JSON 文件的信息 。
运行完毕之后我们可以观察下本地的结果,可以看到 results 文件夹下就多了 100 个 JSON 文件,每部电影数据都是一个 JSON 文件,文件名就是电影名,如图所示 。
6. 多进程加速
由于整个的爬取是单进程的,而且只能逐条爬取,速度稍微有点慢,我们有没有方法来对整个爬取过程进行加速呢?
在前面我们讲了多进程的基本原理和使用方法,下面我们就来实践一下多进程的爬取吧 。
由于一共有 10 页详情页,这 10 页内容是互不干扰的,所以我们可以一页开一个进程来爬取 。而且由于这 10 个列表页页码正好可以提前构造成一个列表,所以我们可以选用多进程里面的进程池 Pool 来实现这个过程 。
这里我们需要改写下 main 方法的调用,实现如下:
import multiprocessingdef main(page): 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.fajihao.com/i/parse_detail(detail_html) logging.info(/'get detail data %s\', data) logging.info(\'saving data to json data\') save_data(data) logging.info(\'data saved successfully\')if __name__ == \'__main__\': pool = multiprocessing.Pool() pages = range(1, TOTAL_PAGE + 1) pool.map(main, pages) pool.close() pool.join()
这里我们首先给 main 方法添加了一个参数 page,用以表示列表页的页码 。接着我们声明了一个进程池,并声明了 pages 为所有需要遍历的页码,即 1-10 。最后调用 map 方法,第一个参数就是需要被调用的参数,第二个参数就是 pages,即需要遍历的页码 。
这样 pages 就会被依次遍历,把 1-10 这 10 个页码分别传递给 main 方法,并把每次的调用变成一个进程,加入到进程池中执行,进程池会根据当前运行环境来决定运行多少进程 。比如我的机器的 CPU 有 8 个核,那么进程池的大小会默认设定为 8,这样就会同时有 8 个进程并行执行 。
运行输出结果和之前类似,但是可以明显看到加了多进程执行之后,爬取速度快了非常多 。可以清空一下之前的爬取数据,可以发现数据依然可以被正常保存成 JSON 文件 。
- 双11尾款满减包含定金的钱吗 2022年双11预售合并支付尾款参加满减吗
- 双11买黄金会比平时买便宜多少 2022年双11买黄金划算吗
- iPad10和新款iPadPro为什么涨价 iPad全线大涨价了吗2022
- 得物一般哪些节日打折 2022得物双十一有活动吗
- 得物双十一优惠力度有多大 2022年得物双十一所有鞋会降价吗
- 得物双十一优惠力度有多大 得物双十一什么时候开始2022
- 老人为啥说窗帘不用蓝色 2022年窗帘流行纯色还是拼色
- 用了一年多的72v电动车能跑多远 72伏电动车能跑多少公里
- ps cs6是哪年的版本 pscs6是最新版本吗
- 2021年倒闭的品牌 2021年315晚会曝光品牌