import requests
import re
class Mao:
def init(self):
‘’’
本质是初始化一些条件,并不是调用其他函数
当前类实例化的时候触发
‘’’
self.count = 1
self.spider_name = “万能爬虫”
# self.run()
def __call__(self, *args, **kwargs):
'''
当前类的对象当做函数使用的时候触发
'''
self.run()
def run(self):
# 获取猫眼的html信息 字符串信息
base_url = "https://maoyan.com/board"
response = requests.get(base_url)
html = response.text
# print(html)
self.get_data(html)
def get_data(self, html):
# 缩小范围 获取电影dd
# 换行不能用.*? 要是用\s\S re.S 可以是\n 换行变为普通字符 .就可以匹配到\n
dd_list = re.findall('<dd>.*?</dd>', html, re.S)
# print(dd_list)
# print(dd_list[0])
# print(len(dd_list))
# import json
# print(json.dumps(dd_list))
# 循环获取dd中的电影信息
for dd in dd_list:
# print(dd)
# 获取排名
rank = re.findall('<i class="board-index board-index-\d{1,2}">(\d+)</i>', dd)[0]
# print(rank)
# 获取电影名称
name = re.findall('title="(.*?)" class', dd)[0]
# print(name)
# 获取主演信息
actor = re.findall('<p class="star">([\d\D]*?)</p>', dd)[0]
if "主演" not in actor:
actor = ""
else:
# 去掉前面和后面的空白
actor = actor.strip()
# print(actor)
# 上映日期
publish_date = re.findall('<p class="releasetime">上映时间:(.*?)</p>', dd)[0]
# print(publish_date)
# 评分信息
score_match = re.search('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(\d)</i></p>', dd)
# print(score.group(1))
# print(score.group(2))
score = score_match.group(1) + score_match.group(2)
# print(score)
# 获取图片
# 浏览器获取到的信息 和代码获取到的信息 有时候不一样
# 写正则表达式的时候 以代码获取到的字符串 为准
# 在获取图片的过程当中 优先获取大图
pic = re.findall('data-src="(.*?)@160w_220h_1e_1c"', dd)[0]
# print(pic)
# 将电影信息 存入字典中
movie_dict = {
"rank": rank,
"name": name,
"actor": actor,
"publish_date": publish_date,
"score": score,
"pic": pic
}
print(movie_dict)
if name == ‘main’:
mao = Mao()
mao()