爬取猫眼网站的电影信息
爬取页面信息的基本思路是:
1、获取页面信息
2、解析页面信息并匹配自己想要爬取的数据
3、组装获取的数据并保存至本地或者数据库
其中第二步解析页面时,需要充分分析页面的结构和信息来源,这也是能否爬取到信息最关键的准备。需要分析信息的来源是js渲染出来的还是页面本身自带,以便决定爬取信息的方式。
import json
import requests
import re
# 1获取网页
def get_page(url):
# 伪装浏览器header
headers = {
"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
}
# 获取页面信息html
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.text
return 'error with you'
#去空格
def strips(list):
n_list=[]
for i in list:
n_list.append(i.strip())
return n_list
# 2解析网页,爬取想要数据并返回
def parse_page(html):
#采用正则表达式匹配
# 根据网页源代码编写所需内容正则表达式
# 电影名
title = re.compile('movieId.*?>.*?<img.*?<img.*?alt="(.*?)" class.*?', re.S)
#匹配结果是一个列表
titles=re.findall(title,html)
strips(titles)
# 演员
start=re.compile('<p class="star">(.*?)</p>',re.S)
starts=re.findall(start,html)
starts=strips(starts)
# 上映时间
time=re.compile('<p class="releasetime">上映时间:(.*?)</p>',re.S)
times=re.findall(time,html)
strips(times)
# 评分
list=[]
mark1=re.compile('<i class="integer">(.*?)</i>',re.S)
marks1=re.findall(mark1,html)
mark2=re.compile('<i class="fraction">(.*?)</i>',re.S)
marks2 = re.findall(mark2, html)
for i in range(len(marks1)):
list.append(marks1[i]+(marks2[i]))
strips(list)
# 图片链接
picture=re.compile('movieId.*?>.*?<img.*?<img.*?data-src="(.*?)" alt.*?', re.S)
pictures=re.findall(picture,html)
strips(pictures)
# 保存图片
for img in strips(pictures):
save_img(img)
# 组合列表
result_list=[]
for i in range(len(titles)):
item={}
item['title']=titles[i]
item['start']=starts[i]
item['time']=times[i]
item['mark']=list[i]
item['picture']=pictures[i]
result_list.append(item)
return result_list
# 3写入保存json数据
def save_json(dict):
# 将数据编码成json格式
result_json_str=json.dumps(dict,ensure_ascii=False)
with open('films.json','w',encoding='utf-8') as f:
f.write(result_json_str)
#获取图片页面
def get_pic(url):
# 伪装浏览器header
headers = {
"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
}
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.content
# 4保存图片
def save_img(url):
# 获取图片页面
img_content = get_pic(url)
# 取图片名字
file_name = url.split('/')[-1].split('@')[0]
# 保存至本地
with open('./imgs/%s' % file_name, 'wb') as f:
f.write(img_content)
def main():
# 1获取单个网页
url='https://maoyan.com/board/4'
html=get_page(url)
# 2返回网页上爬取数据
result=parse_page(html)
print(result)
# 3保存数据至json文件
save_json(result)
if __name__ == '__main__':
main()
爬取多个网页
思路:找到类似信息的网址,其一般有规律可循,对多个网页循环执行爬取信息即可
from day01.test2 import get_page, parse_page, save_json
def main_list():
# 爬取多个网页
result_list=[]
for i in range(10):
id=i*10
# 组装域名
url='https://maoyan.com/board/4?offset=%d' %id
# 获取网页信息
html=get_page(url)
# 解析网页,爬取信息,组装数据
result=parse_page(html)
# 添加至一个列表中
result_list.extend(result)
print(i)
print(result)
# 保存至本地,并完成数据的格式转换
save_json(result_list)
return result_list
main_list()