# 爬虫连载系列(1)--爬取猫眼电影Top100

前言

学习python有一段时间了,之前一直忙于学习数据分析,耽搁了原本计划的博客更新。趁着这段空闲时间,打算开始更新一个爬虫系列。内容大致包括:使用正则表达式、xpath、BeautifulSoup、Pyquery等几个爬虫解析库来爬取一些常见的网站。就当作是对自己这一段时间的学习成果的一个检验。好了,废话不多说,开始进入今天的正题。今天打算的是爬取猫眼电影的Top100榜单。

工具:jupyter notebook

使用的库:requests、re

准备抓取的内容:电影标题、主演、上映时间、评分、

思路分析:

打开猫眼电影官网,找到TOP100榜单,发现有分页结构

# 爬虫连载系列(1)--爬取猫眼电影Top100_第1张图片

按F12,调出开发者工具,选择Network,刷新

# 爬虫连载系列(1)--爬取猫眼电影Top100_第2张图片

注意红框部分,我们再看下第二页的输出

# 爬虫连载系列(1)--爬取猫眼电影Top100_第3张图片

再细看一下内容,发现一页中刚好是10个电影,由此可以确定offset即是对应的每页电影数,这个也正是我们要找的东西。点进去看

# 爬虫连载系列(1)--爬取猫眼电影Top100_第4张图片

我们发现,在Response中,搜索第一个电影名字 霸王别姬,可以找到,说明这个不是动态获取的,可以直接使用,上面那个url就是我们想要获取的链接

# 爬虫连载系列(1)--爬取猫眼电影Top100_第5张图片

接下来我们来看一下网页的结构,在 霸王别姬 标题上右键,检查

# 爬虫连载系列(1)--爬取猫眼电影Top100_第6张图片

可以看出每一个 dd 标签 里面就是一个电影的信息,打开 dd 标签,发现我们要爬取的信息就在里面

# 爬虫连载系列(1)--爬取猫眼电影Top100_第7张图片

开始写代码

接下来就是写代码的事了,代码比较简单,大概就60行左右,在爬取的过程中,为了模拟正常访问,设置成爬取一次休眠0.2s。直接上代码吧:

import requests
import re
import time
import csv

'''
获取页面
depth:爬取深度
'''
def get_page(depth):
    base_url = 'https://maoyan.com/board/4?offset={}'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
        "Accept-Language": 'zh-CN,zh;q=0.9'
    }
    for page_num in range(depth):
        start_url = base_url.format(10*page_num)
        response = requests.get(url=start_url,headers=headers)
        #print(response.content.decode('utf-8'))
        items = parse_html(response.content.decode('utf-8'))
        for item in items:  #遍历迭代器
            write_csv(item)
        time.sleep(0.2)
 
    
#解析数据   
def parse_html(html):
    #使用正则表达式解析数据
    pattern = re.compile('
.*?board-index.*?>(\d+)'+ '.*?name">.*?>(.*?)'+'.*?star">[\s]*(.*?)[\s]*

.*?releasetime">(.*?)

'
+ '.*?integer">(.*?).*?fraction">(.*?).*?
'
,re.S) #print(re.findall(pattern,html)) #对数据进行处理 for one_list in re.findall(pattern,html): yield{ 'index':one_list[0], 'name':one_list[1], 'actor':one_list[2].split(':')[1], #注意: 此处为中问 : 'releasetime':one_list[3].split(':')[1].split('(')[0], 'country':get_erea(one_list[3]), 'score':one_list[4] + one_list[5] } #获取国家 def get_erea(data): pattern = re.compile('.*\((.*?)\)') country = pattern.search(data) if country is None: return "未知" else: return country.group(1) #group(1) 获取第一个括号 匹配的内容 #写入到csv文件中 def write_csv(item): fieldnames = ['index','name','actor','releasetime','country','score'] #定义表头字段,标识写入顺序 with open('./MoviesTop100.csv','a',newline='',encoding= 'utf-8-sig') as f: writer = csv.DictWriter(f,fieldnames=fieldnames) #以字典方式写入 writer.writerow(item) def main(): get_page(11) #共爬取10页,即100条数据 if __name__ == "__main__": main()

结果

接下来我们看一下我们爬取的效果吧

# 爬虫连载系列(1)--爬取猫眼电影Top100_第8张图片

后面,打算用今天爬取的这个数据进行一下分析

你可能感兴趣的:(爬虫,正则表达式,python,数据分析)