简介
目标:利用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('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
输出结果如下
首页排名
同样的方法,分别找到其他信息的源代码进行更改
以下分别为:排名、电影名、演员、上映时间、分数
rank = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
name = re.findall('</i>.*?<a href="/films/.*?" title="(.*?)"',res.text,re.S)
actor = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
time = re.findall('<p class="releasetime">上映时间:(.*?)</p>',res.text,re.S)
score1 = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',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('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
names = re.findall('</i>.*?<a href="/films/.*?" title="(.*?)"',res.text,re.S)
actors = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
times = re.findall('<p class="releasetime">上映时间:(.*?)</p>',res.text,re.S)
scores = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',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)
运行结果
代码运行结果初学正则表达式,如有错误,请多指教!
网友评论