Python:猫眼电影

发布时间 2023-12-15 17:52:44作者: CloudWk

一、猫眼电影排行TOP抓取(小案例)

声明:个人源码仅供自己学习记录,他人使用学习中切勿用于非法用途,请自觉遵守国家法律。造成的损失一概与本人无关。

​ 本文记录了自己学习途中的代码,主要通过正则提取解析网页内容然后存储到本地。猫眼电影拥有反爬机制,使用爬虫加上延时一样会限制爬虫。通过自己的验证,发现headers里面同时加上Referer和Cookie关键字可以有效解决反爬虫

import requests
import re
import time
import json


def get_one_page(url):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        'Referer':'https://www.maoyan.com/board/4?offset=0',
        'Host':'www.maoyan.com',
        'Cookie':'__mta=45446555.1702305147666.1702630145492.1702630166951.153; uuid_n_v=v1; uuid=182070B0983211EEA42BC76D52EF6155E124F6779666424A8A3A9F5BF9F143BC; _csrf=302474aaec1c34983f54bbe7225e9e592e968b1b3e7201f3f4b614e090a72775; _lxsdk_cuid=18c594b183569-0b4f030aaf92cd-26031051-144000-18c594b1836c8; _lxsdk=182070B0983211EEA42BC76D52EF6155E124F6779666424A8A3A9F5BF9F143BC; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1702305143; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1702630167; _lxsdk_s=18c6c90e46a-412-5bf-129%7C%7C187'
    }
    response = requests.get(url=url, headers=headers)
    if response.status_code == 200:
        print('开始抓取中!')
        return response.text
    print('爬取太过频繁!')
    return None

def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False)) # ensure_ascii=False:存储不使用ascii码规范
# if __name__=='__main__':
#     main()
# 爬取:排名、电影封面图链接、电影名、主演、上映时间、评分
def parse_one_page(html):
    # re.S即让.匹配到换行符。尤其在抓取解析网页中re.S使用较频繁。
    pattern = re.compile(
        '<dd>.*?<i class=".*?">(.*?)</i>.*?data-src="(.*?)" alt="(.*?)".*?/>.*?<p class="star">(.*?)</p>'
        '.*?<p class="releasetime">(.*?)</p>.*?i class="integer">(.*?)</i><i class="fraction">(.*?)</i>', re.S
    )
    items = re.findall(pattern, html)
    for item in items:
        yield {
            'index':item[0],
            'imags':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:],
            'time':item[4].strip()[5:],
            'score':item[5].strip() + item[6].strip() #评分在网页中被拆分为两个标签。通过字符串相加拼接在一起
        }
        
def main(offset):
    url = 'https://www.maoyan.com/board/4?offset={}'.format(offset)
    time.sleep(1)
    html_text = get_one_page(url)
    for item in parse_one_page(html_text):
        # print(item)
    	# item = parse_one_page(html_text)
        write_to_file(item) #调用保存文件函数
     print(f'抓取完成!')
    
# with open('测试.txt', 'r', encoding='utf-8') as f:
#     content = f.read()
if __name__=="__main__":
    for i in range(10): # 抓取TOP100
        main(offset=i*10)
        print('---')
        time.sleep(5)