天天看点

python爬取猫眼电影排名前100信息python爬取猫眼电影排名前100介绍请求头的构造爬取猫眼电影信息写入文件打印信息分页爬虫

python爬取猫眼电影排名前100

学习python有一段时间了,最近,发现python爬虫挺有趣的,也很好玩,所以学习学习下,这里我介绍的是爬虫的入门吧,算是爬虫里面最简单的,其方法主要是使用正则的爬取信息,可能现在爬虫技术流行用啥啥框架的,但我觉得打好基础,明白爬虫的意义,其实更为重要。

介绍请求头的构造

学好爬虫,才发现对于网络的知识方面的贮备也是要需要的,我这边主要介绍的是当你去访问网站的时候,有一东西重要的,叫请求头,用来说明服务器要使用的附加信息。

python爬取猫眼电影排名前100信息python爬取猫眼电影排名前100介绍请求头的构造爬取猫眼电影信息写入文件打印信息分页爬虫

Accept

请求报头域,用于指定客户端可接受哪些类型的信息

Accept-Language

这是指定客户端可接受的语言类型

Cookie

也常用cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据,作用是为了维持当前的访问会话。

Referer

这是辨识这个请求是从哪个页面发过去的,服务器可以拿到这一信息并做相应的处理,如做源统计、防盗链处理等

User-Agent

这是一个特殊的字符串头,可以使服务器辨识客户使用的操作系统及版本,在爬虫时最好加上,不然很容易被辨认出是爬虫的行为。

这里我就介绍常用的几个参数吧,因为在以后的爬虫中会经常使用这些参数的

爬取猫眼电影信息

分析

在爬虫网页时,其实也是分情况的,因为有些网站设了反爬虫的机制,所以在练习初期,我们还是先爬取一些简单的网站信息吧,这里我们爬取的网站为https://maoyan.com/board/4,排行前100名的电影信息

python爬取猫眼电影排名前100信息python爬取猫眼电影排名前100介绍请求头的构造爬取猫眼电影信息写入文件打印信息分页爬虫
python爬取猫眼电影排名前100信息python爬取猫眼电影排名前100介绍请求头的构造爬取猫眼电影信息写入文件打印信息分页爬虫

以上二张是分别为第一页和第二页,注意观察他们的url的变化,后面有一个参数offset,这是一个偏移量的参数,当你点击第三页时,唯一变的就是offset,所以可以猜测这个参数如果为30的话就是代表31-40的电影的信息情况,以此类推,只要我们请求十次,而把offset设为0,10,…一直到90,我们再通过正则去匹配,这样我们就爬到了前100页的电影的信息。

抓取首页

在写代码前,还需要爬虫的几个库:requests,还有一些json库time库,后续完善需用到,这里我们先要抓取第一页的网页信息,我们写一个get_one_page的函数,并给他传入url的参数

def get_one_page(url):
    try:
        headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
    except RequestException:
        return None
           

这个我用try函数,能够捕捉到异常处理,当它请求的状态码为200的时候,就会返回html的整个页面,异常则返回none

正则提取信息

接下来就是打开f12,在开发者模式下的Network监听组件下查看源代码,注意不要去看Elements下的源代码,因为那里可能是经过js操作而原始的请求不同

python爬取猫眼电影排名前100信息python爬取猫眼电影排名前100介绍请求头的构造爬取猫眼电影信息写入文件打印信息分页爬虫

这是第一名的电影信息对应的html代码,可以发现,一部完整的电影信息在一个dd节点上,而排名信息是在class为board-index的 i 节点上,这里我们推荐用非贪婪匹配,正则表达式为

<dd>.*?board-index.*?>(.*?)</i>
           

然后要提取电影的图片,正则可以写成

<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)"
           

然后去匹配电影的名称、主演、发布时间也是如此。

最后最终的正则匹配为:

<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>
           

这样我们就再构造个函数parse_one_page()

def parse_one_page(html):
    pattern = re.compile(
        '<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', 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:] ,
            'time': item[4].strip()[5:] ,
            'score': item[5] + item[6]
        }
    print(items)
           

这里的话,complie是将正则字符串编译成正则表达式的对象,最后re.S是一个修饰符的作用,最后的yield函数则是为把一些信息用key-value的形式以字典的方式展现出来,这样我们就提取到了首页的信息了。

写入文件

我们可以将爬虫获取的信息给存放在txt的文件下,这里的话,需要用到json库的dumps()的方法实现对字典的序列化的操作,代码如下:

def write_to_file(content):
    with open('result.txt', 'a' ,encoding='utf-8') as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
           

打印信息

我们还需要通过一个主函数main()来打印电影信息,并将结果到txt文件下

def main(offer):
    url = 'https://maoyan.com/board/4?offset=0' + str(offer)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)
           

分页爬虫

最后我们需要爬虫十页的结果,则offset当作变量,可以这样:

if __name__ == '__main__':
    for i in range(10):
        main(offer = i*10)
        time.sleep(5)
           

range函数,可以创建一个整数列表,一般用在 for 循环中,不过它默认从0开始,比如range(5),这是从0开始到4结束,打印出来的结果为[0,1,2,3,4],最后这个做一个延时等待,怕速度过快,没有响应。

最后进行代码整合一下,查看结果,发现成功的爬取到了前100的电影信息了,是不是很神奇,也很激动不,哈哈哈。