苹果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'<input.+?\n.+?<td>'+moviename+'</td>' #正则表达式精确查找电影名。
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)+"个影片")