利用Requests+正则表达式爬取猫眼电影,学习全过程记录与体会。

利用Requests+正则表达式爬取猫眼电影,学习全过程记录与体会。

无小意丶无小意丶

声 明

本文章为爬虫学习的实战项目——猫眼电影爬虫,总结笔记。

学习资料,来自于Python3爬虫三大案例实战分享 - 网易云课堂

视频作者——崔庆才,崔大神。 @静觅

作者博客地址:静觅丨崔庆才的个人博客

目 的:

数据分析师,学习作为生存原料的数据的采集工作。

学习python语法的运用,爬虫原理的理解


参考学习资料:

Python3爬虫三大案例实战分享 - 网易云课堂

Python正则表达式 | 菜鸟教程

Python3 教程 | 菜鸟教程

快速上手 - Requests 2.18.1 文档


环境配置:

1.系统环境:WIN8

2.编译环境:Python3.5

3.所需库:requests、re、json、multiprocessing

4.IDE:Pycharm


学前疑惑:

1.如何获取网站源代码?

2.如何从网页源代码中获取想要的信息?

3.如何将获取的信息进行保存?


具体代码:

如下所示,代码中有些部分有加入个人解释。


import requests
from  requests.exceptions import RequestException
import re
import json
from multiprocessing import Pool

def get_one_page(url):#获取网页源代码,为了防止程序中断,需要设计获取错误,返回None。
    try:
        user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
        headers = {'User-Agent': user_agent}#设置请求头,不然无法正常获取网页信息。视频中无需采用请求头,但是实际操作中需要。
        response=requests.get(url,headers=headers)
        if response.status_code==200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):#解析网页代码,利用正则获取需要的信息,再通过生成器,生成item字典。
    pattern=re.compile('<dd>.*?board-index.*?">(\d+)</i>.*?src="(.*?)".*?<a.*?>'
                       +'(.*?)</a>.*?<p.*?star">(.*?)</p>.*?releasetime">(.*?)'
                        +'</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)#依次获取电影的序列,图片地址,标题,主演,时间,得分。
    items=re.findall(pattern,html)
    for item in items:
        yield {
            'index':item[0],
            'image':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:],#strip()可以去除换行符
            'time':item[4].strip()[5:],
            'score':item[5]+item[6]


        }

def write_to_file(content):#将获取的信息,字典形式,转换为JSON格式写入TXT。
    with open('result.txt','a',encoding='utf-8') as f:#'a'方法为添加进入,enecoding设置编码格式以防乱码
        f.write(json.dumps(content,ensure_ascii=False) +'\n')#将字典转化为JS格式
        f.close()

def main(offset):#主程序,调用各个函数。
    url='http://maoyan.com/board/4?offset+' + str(offset)
    html=get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

if __name__ == '__main__':#暂时不清楚具体作用,但是可以用来调用主程序,并且加入进程池功能。
        pool=Pool()
        pool.map(main,[i*10 for i in range(10)])


项目结果:

{"index": "1", "time": "1993-01-01(中国香港)", "score": "9.6", "image": "//ms0.meituan.net/mywww/i", "title": "霸王别姬", "actor": "张国荣,张丰毅,巩俐"}
{"index": "2", "time": "1994-10-14(美国)", "score": "9.5", "image": "//ms0.meituan.net/mywww/i", "title": "肖申克的救赎", "actor": "蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿"}
{"index": "3", "time": "1953-09-02(美国)", "score": "9.1", "image": "//ms0.meituan.net/mywww/i", "title": "罗马假日", "actor": "格利高利·派克,奥黛丽·赫本,埃迪·艾伯特"}

.....

.....

......

{"image": "//ms0.meituan.net/mywww/i", "index": "8", "time": "1993-07-01(中国香港)", "actor": "周星驰,巩俐,郑佩佩", "title": "唐伯虎点秋香", "score": "9.2"}
{"image": "//ms0.meituan.net/mywww/i", "index": "9", "time": "2001-07-20(日本)", "actor": "柊瑠美,入野自由,夏木真理", "title": "千与千寻", "score": "9.3"}
{"image": "//ms0.meituan.net/mywww/i", "index": "10", "time": "1940-05-17(美国)", "actor": "费雯·丽,罗伯特·泰勒,露塞尔·沃特森", "title": "魂断蓝桥", "score": "9.2"}


TXT文件中共有一百行数据,运行成功。


学习思路回顾:

打开视频以后,了解了这次爬虫的目标是TOP100榜 - 猫眼电影 - 一网打尽好电影。首先,对网站代码进行获取。用的是最方便的requests库,get用法。但是,发现,无法正常获取到信息,百度相关问题后,使用加入请求头的办法,网站数据正常获取。为了防止程序中断,第一个获取网页数据的函数get_one_page,加入了两个进程错误处理。一个是请求状态码不为200时,另一个是获取网页代码失败时的错误处理。

第二部分,是网页代码解析部分。主要办法是利用正则表达式,从网页源代码中找出符合正则的代码部分,再利用正则中(.*?)的用法,对关键信息提取,再利用re.findall方法进行搜索。最后对搜索结果进行遍历,用yield——生成器,生成了一个字典item。

第三部分,将获取的数据——字典item,用json.dumps方法,将字典转化为 JSON格式以便用来存储。但是,结果是乱码,需要再进行字符编码处理。写入时,声明encoding='utf-8',json.dumps方法调用时,声明ensure_ascii=False。

第四部分,main()程序调用各个函数。并且通过观察不用页的网站地址规律,加入多页爬取的办法。if __name__ == '__main__',使用这行代码调用main()程序,但是搜索之后对他的具体作用还不是很清楚,暂时先搁置。同时,使用下面这两行代码,尝试使用进程池办法。速度有提升,但是不明显。

pool=Pool()
pool.map(main,[i*10 for i in range(10)])


课外思考:

为什么需要用不同函数的组合来完成程序呢?个人想法,一个是,逻辑清楚明确,一个函数对应一个功能,出现问题后找错误的速度很快,而且不会影响其他函数的进行,是个好习惯,以后需要多去以函数形式完成程序。第二个,如果我这次完成了这个爬虫,那我下次其他爬虫程序,当我需要一部分功能时,是不是直接从原先的代码直接复制相应函数进行修改就能使用了?非常方便。

正则表达式爬虫非常好用!有什么使用范围吗?通过网页代码获取的数据,可以是可以看到的文字形式。所以,文字类的采集应该都能适用,不过知乎好像不行。还有,视频的采集,个人想法是先采集视频的地址,再用过其他库去下载相应文件,以后再进行相关学习实践。图片信息的采集,怎样能直接保存?还没学习,个人猜想需要利用数据库保存数据,以后再另外学习。

对于数据库的使用很感兴趣,但是却还没触及,下一部分需要好好学习相关用法。


下一部分学习目标:

Python3爬虫三大案例实战分享 - 网易云课堂

这周内完成。


第二篇爬虫实战笔记已经完成了!

零基础爬虫学习全记录2:今日头条指定搜索内容下的所有图集图片保存——图片采集小程序

完成时也更加用心,质量也更高一些,希望大家能给予一些指导。

这一篇的爬虫,更有爬虫的思维,特别推荐,欢迎持续关注。

欢迎各位私信,关注,共同学习交流进步!

「你的一点点支持,我将会铭记长久!」
还没有人赞赏,快来当第一个赞赏的人吧!
文章被以下专栏收录
9 条评论
推荐阅读