用python实现苹果cms电影网站的自动采集

苹果cms电影网站的自动采集

用苹果cms搭建的电影网站,采集影片可以通过后台的自定义资源库链接资源网站。这种方式简单易操作。但是问题是采集的时候只有两种属性可以选择,一是可以选择影片类型,二是可以有限的选择影片更新时间。这样操作的结果就是无法区分质量,良秀不齐,好片烂片一键全踩。

为了解决这个问题,用python编了个小程序实现按指定影片名字批量采集。
第一部分是个爬虫程序,从豆瓣影片排行榜爬取各个类型影片好评率排在前30%的影片,也可以只选前10%或20%。把影片名称存为“***.Txt”文件。
第二部分采集程序, 按照影片名称逐个搜索并采集到自己的电影网站上。
这样可以保证自己的电影库只采集排名靠前的好影片,片不在多而在精。以下为采集部分程序的源码。仅供参考。

# 模拟苹果cms后台自定义资源库里的查询。 提取数据用正则表达式和xpath
# 目前是精确查询,如查“蛇”,不会把其他带“蛇”字的影片采集到。也可改为模糊查询
import os
import random
import time
import requests
from lxml import etree
import re

def getmnames():  # 从文件中导出电影名列表
    with open("e:\dc\dbrate\影片名.txt", 'r', encoding='utf-8')as f:
          mname = f.readline()
          while mname:
                 getid_1156(mname.replace('\n', ''))
                 mname = f.readline()

def getid_1156(moviename):
    # 本函数调用苹果cms后台-自定义资源库-1156资源-[查询按钮],按名称查询电影,如果查到就抽取电影的id, 然后直接按id采集电影
    global colsum
    path = r'e:\dc\anmolive\\'  # 指定一个保存文字和图片的文件夹, dc意思是datacenter
    folder = os.path.exists(path)
    if not folder:  # 判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path)  # makedirs 创建文件时如果路径不存在会创建这个路径

    #  构造指定起始点的页面的网址
    url = 'http://anmo.live/login.php/admin/collect/api.html?ac=list&cjflag=59a9b8208b4b3f76ab1f5a83cdf&' \
          'cjurl=http%3A%2F%2Fcj.1156zy.com%2Finc%2Fapi.php&h=&t=&ids=&wd=' + moviename + '&type=1&mid=1¶m=&page=1&limit='
    # 1156资源网的cookie
    cookies_1156 = {'UM_distinctid': '172bc03c10f-06e3278c369-f7d123e-1fa400-172bc430d3ec',
                    '__cfduid': 'da522209aa7174fd411d5d1469f1596271935',
                    'PHPSESSID': '7bee1f791647ec61ed93e1d1c11a13a3',
                    'admin_id': '1',
                    'admin_name': '×××',
                    'admin_check': '4bf45d54e07ea484d09214f2fda',
                    'CNZZDATA1277635278': '784101942-1596271233-http%253A%252F%252Fanmo.live%252F%7C1596415349'}
    headers = get_headers()
    try:
        print('正在查找' + moviename)
        r = requests.get(url, headers=headers, cookies=cookies_1156)
    except:
        print("Connection refused by the server..")
        time.sleep(5)

    cont = r.content  # r.content返回的是bytes型的数据
    contstr = str(cont, 'utf-8')  # 转成utf-8字符串
#上边的请求会返回所有包含查询词的名字,如搜美女,返回资源站所有带美女两字的电影名,
    reg_rul = r''+moviename+''  #正则表达式精确查找电影名。
    reg = re.compile(reg_rul)
    movie_list = reg.findall(contstr)  # img_list 是包含所有imgurl的list

    if movie_list:  #如果找到了,用xpath提取value的值
        ethtml = etree.HTML(movie_list[0])  # 字符串转成xpath可处理的格式
        movieids = ethtml.xpath('//input[@class="layui-checkbox checkbox-ids"]/@value') #xpath取出电影的id
        for movieid in movieids:
            col_url = 'http://anmo.live/login.php/admin/collect/api.html?cjflag=59a9b825dfa8b76ab1f5a83cdf&' \
                      'cjurl=http%3A%2F%2Fcj.1156zy.com%2Finc%2Fapi.php&h=&t=&ids=&wd=%E9%87%91%E5%88%9A%E7%8B%BC&type=1&mid=1' \
                      '¶m=&page=%7Bpage%7D&limit=%7Blimit%7D&ac=cjsel&ids=' + movieid
            try:
                  r = requests.get(col_url, headers=headers, cookies=cookies_1156)
            except:
                  print("Connection refused by the server..")

            result = r.content  # r.content返回的是bytes型的数据
            result = str(result, 'utf-8')  # 转成utf-8字符串
            if result.find("下载成功") != -1:
                colsum += 1
                print(moviename + ' 采集成功')
            elif result.find("未绑定") != -1:
                print('发现影片<' + moviename + '>, 分类未绑定,未更新。 ')
            elif result.find("无需更新") != -1:
                print('影片<' + moviename + '>, 无需更新。 ')
            else:
                print('发现影片<' + moviename + '>,未更新。')
    else:  # 没搜到精确的影片名, 把名字存入没采到列表中
         with open(path + '1156mcdlist.txt', 'a', encoding='utf-8')as mcdf:  # 这个文件mcdlist.txt保存没采集到的影片名字
            mcdf.write(moviename + '\n')
            print(moviename + ' 未发现。')

def get_headers():  # 随机获取一个headers
    user_agents = ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
                   'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
                   'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
                   'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'
                   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36']
    headers = {'User-Agent': random.choice(user_agents)}
    return headers


colsum = 0  # 采集成功的数量
getmnames()
print("已成功采集"+str(colsum)+"个影片")

你可能感兴趣的:(苹果cms,python,html,正则表达式,xpath)