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()