Python爬虫小练习——正则表达式爬取猫眼电影Top100榜单

简介

目标:利用python爬虫,获取猫眼电影Top100榜单数据(排名、电影名、演员、上映时间及国家、评分),并以CSV格式储存。
主要内容及爬取思路:
1.导入所需python库(requests/re/time/csv)、headers等必备信息
2.以首页为例,获取首页源代码,利用正则表达式提取各类所需要的信息
3.观察页面URL变化规律,构造链接池
4.将所获取数据,写入CSV文件储存

以猫眼电影Top榜单首页为例,提取各类所需信息

链接地址:https://maoyan.com/board/4?offset=0

猫眼电影

右键点击检查,分别找到排名、电影名、主演、上映时间及评分的源代码
排名源代码

利用正则表达式,在排名源代码基础上进行更改,构造出可以提取整个页面所有排名信息的表达式。
rank = re.findall('(.*?)',res.text,re.S)
输出结果如下
首页排名

同样的方法,分别找到其他信息的源代码进行更改
以下分别为:排名、电影名、演员、上映时间、分数

rank = re.findall('(.*?)',res.text,re.S)
name = re.findall('.*?.*?主演:(.*?)

',res.text,re.S) time = re.findall('

上映时间:(.*?)

',res.text,re.S) score1 = re.findall('

(.*?)(.*?)

',res.text,re.S)

构造能够获取所有页面的链接表达式

通过观察,每一分页的链接表达式分别为:
第一页:https://maoyan.com/board/4?offset=0
第二页:https://maoyan.com/board/4?offset=10
第三页:https://maoyan.com/board/4?offset=20
可以发现规律,每一分页只有在后面的参数发生了变化,所以如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数设置为 0,10,20,…,90 即可。
可使用一个for循环,循环10次即可。为了防止网页对爬虫进行封杀,将休眠时间time定为2秒,阶段代码如下。

urls = ['https://maoyan.com/board/4?offset={}'.format(str(i))for i in range(0,100,10)]
for url in urls:
    get_info(url)
    time.sleep(2)

将所获取数据存储进CSV文件

f = open('D:\PycharmProjects/1.csv','w+')
writer = csv.writer(f)
writer.writerow(['XXX','XXX','XXX'])

代码汇总

将阶段性代码封为函数、

import requests
import re
import time
import csv

f = open('D:\PycharmProjects/2.csv','w+',encoding='utf-8',newline='')
writer = csv.writer(f)
writer.writerow(['rank','name','actor','time','score'])

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


def get_info(url):
    res = requests.get(url, headers=headers)
    ranks = re.findall('(.*?)',res.text,re.S)
    names = re.findall('.*?.*?主演:(.*?)

',res.text,re.S) times = re.findall('

上映时间:(.*?)

',res.text,re.S) scores = re.findall('

(.*?)(.*?)

',res.text,re.S) for rank, name, actor, play_time, score in zip(ranks,names,actors,play_times,scores): writer.writerow([rank,name,actor.strip(),time,score[0]+score[1]]) if __name__ == '__main__': urls = ['http://maoyan.com/board/4?offset={}'.format(str(i)) for i in range(0,100,10)] for url in urls: get_info(url) time.sleep(2)

运行结果

代码运行结果

初学正则表达式,如有错误,请多指教!

你可能感兴趣的:(Python爬虫小练习——正则表达式爬取猫眼电影Top100榜单)