[Python3网络爬虫开发实战] 3.4-抓取猫眼电影排行,利用csv存储数据,代码更加惊骇简洁

申明:
学习崔庆才教授书籍[Python3网络爬虫开发实战] 3.4-抓取猫眼电影排行,崔庆才教授写的非常好,本博文与崔庆才教授的博文原理相同,但是代码很大不一样,更加直接了当,惊骇简洁,但讲得没那么详细,适合有基础的人学习,本博文利用csv存储数据

利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容。

1. 本节目标

本节中,我们要提取出猫眼电影TOP100的电影名称、时间、评分、图片等信息,提取的站点URL为http://maoyan.com/board/4,提取的结果会以文件形式保存下来。

2. 准备工作

安装requests,re,csv库

3.csv库存储数据

(1).我们一般爬取的数据要么打印在屏幕上,要么存储在TXT文档中,这些格式并不利于数据的存储。那么大家平时是用什么来存储数据呢?大部分人可能是微软公司的Excel来存储数据,大规模数据则是使用数据库。CSV是存储表格数据的常用格式,Excel 和很多应用都支持CSV格式,因为它很简洁。那为什么我不直接存储在Excel中呢,也许学过Excel存储数据的大佬知道,数据存储在Excel中存储时很不方便,每个数据都需要指定(x,y)才能存,很麻烦,但存储在CSV就简单地多,因为他是一行一行存的,非常非常方便,结构跟Excel表格一样,打开后也是用excel打开的,简单地说CSV结构就是excel结构,区别就是文件后缀名不同。你可以直接认为是存储在了excel中。如果你是处女座的话,你就另存为excel文件(改变的只是后缀名)就是了,几秒钟的事,其实本来就是excel表格的。

(2)学习用CSV库存储数据的学习

import csv
fp = open('maoyan.csv', 'w+', newline='', encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('排位', '影片图片','名字', '主演', '上映时间及地区', '评分'))
writer.writerow(('1','http://[email protected]_220h_1e_1c','霸王别姬','张国荣,张丰毅,巩俐','1993-01-01 9.6'))
writer.writerow(('2','http://pvie/[email protected]_220h_1e_1c','肖申克的救赎','蒂姆·罗宾斯','1994-10-14(美国)', '9.5'))
writer.writerow(('3','http://p1.ie/[email protected]_220h_1e_1c','罗马假日','格利高里·派克','1953-09-02(美国)','9.1'))
运行结果是:

(3)存储格式转变
运行出来后maoyan.csv文件里面是乱码,先用记事本打开,而后另存为编码是UTF-8的文件即可。这时再通过Excel打开,便不会是乱码了。

3. 抓取分析

我们需要抓取的目标站点为http://maoyan.com/board/4,打开之后便可以查看到榜单信息,如图3-11所示。[Python3网络爬虫开发实战] 3.4-抓取猫眼电影排行,利用csv存储数据,代码更加惊骇简洁图3-11 榜单信息

排名第一的电影是霸王别姬,页面中显示的有效信息有影片名称、主演、上映时间、上映地区、评分、图片等信息。

将网页滚动到最下方,可以发现有分页的列表,直接点击第2页,观察页面的URL和内容发生了怎样的变化,如图3-12所示。

[Python3网络爬虫开发实战] 3.4-抓取猫眼电影排行,利用csv存储数据,代码更加惊骇简洁图3-12 页面URL变化

可以发现页面的URL变成http://maoyan.com/board/4?offset=10,比之前的URL多了一个参数,那就是offset=10,而目前显示的结果是排行11~20名的电影,初步推断这是一个偏移量的参数。再点击下一页,发现页面的URL变成了http://maoyan.com/board/4?offset=20,参数offset变成了20,而显示的结果是排行21~30的电影。

由此可以总结出规律,offset代表偏移量值,如果偏移量为n,如果想获取TOP100电影,只需要分开请求10次,而10次的offset参数分别设置为0、10、20、…90即可,这样获取不同的页面之后,再用正则表达式提取出相关信息,就可以得到TOP100的所有电影信息了。

代码如下:

import requests
import re
import csv
import time

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}

def get_one_page(url):
    r = requests.get(url,headers = headers)
    if r.status_code==200:
        nums = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',r.text,re.S)
        images = re.findall('<img data-src="(.*?)" alt=".*?" class="board-img" />', r.text, re.S)
        names = re.findall('<p class="name"><a href=".*?" title="(.*?)" data-act="boarditem-click"',r.text,re.S)
        actors = re.findall('<p class="star">(.*?)</p>',r.text,re.S)
        times_places = re.findall('<p class="releasetime">上映时间:(.*?)</p>',r.text,re.S)
        scores_1_2s = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i>',r.text,re.S)
        for num,image,name,actor,time_place,scores_1_2 in zip(nums,images,names,actors,times_places,scores_1_2s):
            score = scores_1_2[0] + scores_1_2[1]
            writer.writerow((num,image,name,actor.strip().replace('主演:',''),time_place,score))
        print('成功爬取')
    else:
        print('网页出错')

if __name__=='__main__':
    fp = open('maoyan.csv', 'w+', newline='', encoding='utf-8')
    writer = csv.writer(fp)
    writer.writerow(('排位', '影片图片','名字', '主演', '上映时间及地区', '评分'))
    urls = ['http://maoyan.com/board/4?offset={}'.format(str(n)) for n in range(0,91,10)]
    for url in urls:
        get_one_page(url)
        time.sleep(0.2)
    fp.close()
我在写的时候,爬取图片时总是爬不到数据,后来看了一下书,原来是这样:这里不要在Elements选项卡中直接查看源码,因为那里的源码可能经过JavaScript操作而与原始请求不同,而是需要从Network选项卡部分查看原始请求得到的源码。豁然开朗,感谢崔庆才教授指点。

到此为止,我们的猫眼电影TOP100的爬虫就全部完成了

9. 运行结果

[Python3网络爬虫开发实战] 3.4-抓取猫眼电影排行,利用csv存储数据,代码更加惊骇简洁

可以看到,电影信息也已全部保存到了文本文件中了,大功告成!从中也能看到,数据存储其实就是存储在excel中,为利用数据做好了准备。

 希望能给你带来实质性的帮助,如有说的不对之处,请留言,如果认可我的文章,请关注我的博客https://blog.csdn.net/huang1600301017   谢谢!

      如想学习Python相关知识,请关注我的公众号    Python编程与人工智能社区     

      二维码:

                    [Python3网络爬虫开发实战] 3.4-抓取猫眼电影排行,利用csv存储数据,代码更加惊骇简洁    

        再次感谢您阅读我的博客!