0x0 本代码用途前瞻
说明:TorrentKitty大家经常用吧,呵呵,冷门视频资源搜索利器,当然你下载什么我管不了啊哈~除了torrentkitty,别的搜索服务比如豆瓣Top250、的七日热门什么的也类似,只要是比较规则存放的、防爬虫弱的大家举一反三,将需要的内容存放到数据库,方便后续分析,大数据、科学计算啥的。
PS1:代码中会写详细的注释,解释每一行是什么用途/为何这样写。
PS2:BeautifulSoup的语法确实比xpath更加简洁容易懂,理清思路,分步一步一步循序渐进,就能够得到解决方案。
0x1 注意事项及代码功能
1.本代码会将结果加入Mongodb数据库!!!
2.一定要注意Python的缩进,缩进是代码段完整及正确与否的标志,这个经常容易出错!!!
3.编辑器推荐Sublime Text直接可以运行代码,而且主题也很漂亮,不用拖着庞大的Pycharm,机器运行噪音太大。
4.本代码是python2的代码,python3不适用。
以下是代码编写开始设计的目标,历时大概3-4天,利用搜索引擎逐渐完善了代码功能。
#任务1:筛选文件大小满足条件的文件 <<<<<>>>>>
#任务2:使用代理,而不是使用全局代理。使得其他软件的使用不受影响。 <<<<<<这个暂时没实现,只是防止这个网址连接不上,我这不需要,因为SS可以搞定“墙”>>>>>>
#任务3:根据搜索内容,转换为正常字符,命名文件名保存,而不是每次都是同一个文件名。 <<<<<>>>>>
#任务4:每20个链接保存一个文件,之后另增加文件保存。 <<<<<>>>>>
#任务5:将抓取内容存放到MySQL或者其他简单数据库。Monogodb <<<<<>>>>>
#任务6:增加用户输入,然后搜索用户输入的内容。 <<<<<>>>>>
#任务7:使用beautifulsoup方法实现抓取。实现高级筛选功能。 <<<<<>>>>>
0x2 需求分析及实现构思
关键1.如何实现搜索关键字的编码转换,使得网页请求得到正确结果?
关键2.如何定位种子文件标签位置?
关键3.如何根据html的特征筛选我们需要的那些种子文件?
关键4.如何建立与mongodb的链接并保存到数据库?
0x3.1 代码主体:
# -*- coding: utf-8 -*-
import urllib2
import urllib
from lxml import etree
import codecs
import requests
from bs4 import BeautifulSoup
import pymongo_imp
search_list=['keyword1','keyword2'] #这里建立一个关键字列表,一次性把想要搜索的内容全部搜索一遍,解放你的双手和眼睛。
for keys2x in search_list:
url = 'https://www.torrentkitty.tv/search/'
# keys2x = raw_input("请输入搜索关键字:")
keyword = urllib.quote(keys2x) # 这是python2的语法
pages = 30
file_name = '/Users/llm/PycharmProjects/' + keys2x + '.txt'
ks = file_name
for page in range(0, pages):
page = str(page)
print "当前页码:%s" % page
site = url + keyword + '/' + page
h = urllib2.Request(site) ###
h.add_header('User-Agent',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 (FoxPlus) Firefox/2.0.0.14')
try: #引入异常处理机制
ht = urllib2.urlopen(h) #网页请求
html = ht.read(ht)
soup = BeautifulSoup(html, "lxml") #####>>>>>>1 创建美丽汤。
movie_list_soup = soup.find('table', attrs={'id': 'archiveResult'}) #####>>>>>>2 定位到列表所在位置。#archiveResult
movie_name_list = [] #####>>>>>>3 新建列表,存放查找内容。
search_flag=0
for movie_li in movie_list_soup.find_all('tr'): #####>>>>>>4 设置过滤器。找到所有tr标签。
search_flag=search_flag+1
if search_flag > 1: #####>>>>>>4.1 设置查找标志,跳过第一个,因为第一个是表头。
detail = movie_li.find('td', attrs={'class': 'size'}).getText() #####>>>>>>5 定位所有的size标签,得到字符串。
#上面获取了文件大小。
#print "%s \n" % detail
if movie_li.find('a', attrs={'rel': 'magnet'}) is None:
pass
else:
detail_name1 = movie_li.find('a', attrs={'rel': 'magnet'})['title']
FHD_flag=detail_name1.find('FHD')
Thz_flag=detail_name1.find('Thz.la')
if FHD_flag<>-1 or Thz_flag<>-1: #####>>>>>>5.1 如果是高清或者是tha.lz那么就存档。
##if detail.find('mb')<>-1: #####>>>>>>6 如果文件大小满足要求,那么下一步寻找兄弟节点。
#文件名称
if movie_li.find('a', attrs={'rel': 'magnet'}) is None:
pass
else:
detail_name=movie_li.find('a', attrs={'rel': 'magnet'})['title']
#上面获取了文件名称。❕
print detail_name
# 文件大小 detail
print detail
#链接地址
file_name = ks + '_' + page # 让文件按页码保存,避免一个文件中链接数量太多。
if movie_li.find('a', attrs={'rel': 'magnet'}) is None: ####>>>>>>> 如果为非空,那么就获取。
pass
else:
detail_mag=movie_li.find('a', attrs={'rel': 'magnet'})['href'] #####>>>>>>7 获取磁力链接地址。
#上面获取了磁力链接。❕
print detail_mag
#with open(file_name, 'a') as p: # '''Note''':Append mode, run only once!
# p.write("%s \n \n" % detail_mag) ##!!encode here to utf-8 to avoid encoding
#获取了磁力链接之后开始存入数据库。
print "开始进行mongodb数据库操作:"
#存入数据库
db=pymongo_imp.get_db()
my_collection = pymongo_imp.get_collection(db)
pymongo_imp.insert_one_doc(db,detail_name,detail,detail_mag)
print "截止目前,数据库中存放条目数量:%s个" % int(my_collection.count())
except:
pass
0x3.2 Mongodb操作模块:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# 《Torrent magnet存入数据库思路》
'''
# 1.利用python字符串处理函数获取唯一✅标识,(先尝试是否可以手动增加_id进去)
# 2.每次保存数据之前,先搜索数据库,确保没有重复,然后再保存。
# 3.保存字段有:【文件名、文件大小、链接、时间、关键标识】
# 4.file_name0 filesize0 magnet0 datetime0 keywords0
# 5.
'''
import pymongo #导入pymongo模块 。PS:让py2.7安装pymongo的命令是 pip2 install ,相应的让3安装就是pip3 install
import datetime #导入时间模块
import re #导入正则模块
def get_db():
# 建立连接
client = pymongo.MongoClient(host="127.0.0.1", port=27017) #设置主机地址和端口,建立数据库链接。
db = client['torrentkitty'] #或者使用字典的方式获取链接。
#或者 db = client.example #获取属性的方式
return db #返回获取到的数据库
def get_collection(db):
# 选择集合(mongo中collection和database都是延时创建的)
coll = db['informations'] #选择这个集合。多个document的合体,就是集合。
#print db.collection_names() #打印集合名字
return coll #返回集合
def insert_one_doc(db,file_name0,filesize0,magnet0):
# 插入一个document #mongodb中每一条信息叫document
coll = db['informations'] #选择这个集合
#step1 获取magnet链接的keyid 21-61位为关键字串 [20:61]
keywords0=magnet0[20:60]
#step2 查找keywords0是否重复。
if coll.find_one({"Vedio_KeyID": keywords0}) == None:
print "数据库中没有该文件。Will Add to the database!"
information = {"Vedio_name": file_name0, "File_size": filesize0, "Magnet_Link": magnet0,
"Save_Time": datetime.datetime.utcnow(), "Vedio_KeyID": keywords0} # 字典,准备插入的字典。
information_id = coll.insert(information) # 插入这一条字典,获取
print information_id
else:
print "数据库已经有该文件。忽略!"
pass
#print "else"
def get_many_docs(db,find_key):
# mongo中提供了过滤查找的方法,可以通过各种条件筛选来获取数据集,还可以对数据进行计数,排序等处理
coll = db['informations']
#ASCENDING = 1 升序;DESCENDING = -1降序;default is ASCENDING
item_list=[]
for item in coll.find({"Vedio_name":re.compile(find_key)}).sort("Vedio_name", pymongo.DESCENDING):
print item
item_list.append(item)
count = coll.count()
print "集合中所有数据 %s个" % int(count)
return item_list
#条件查询
#count = coll.find({"name":"quyang"}).count()
#print "quyang: %s"%count
if __name__ == '__main__':
print "Please use it by import!"
db = get_db() # 建立链接
my_collection = get_collection(db) # 获取集合
post = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()} # 设置需要插入的内容,为一个字典。
# 插入记录
my_collection.insert(post) # 插入上面的字典
print my_collection.find_one({"x": "10"})
information = {"name": "quyang", "age": "25"} #字典,准备插入的字典。
information_id = my_collection.insert(information) #插入这一条字典,获取
print information_id
0x4 使用方法及运行结果:
- 用法:将0x3中的两段代码(数据库操作脚本命名为pymongo_imp.py)分别拷贝并建立py文件并存放到一个目录下面,执行主代码即可。
- 附上GitHub地址可以下载源代码,这上面的文件不会出现缩进错误:https://github.com/perfectswpuboy1/torrent_to_mongodb
0x5 参考链接:
- MongoDB与python交互
- MacbookPro,寒假想学下Python,用什么软件好一点?
- 你是如何自学 Python 的?
- python爬虫torrentkitty的种子