利用python代码爬取torrentkitty上的种子并存放到mongodb数据库

Mac下mongdb数据库管理利器-Robo 3T

0x0 本代码用途前瞻


说明:TorrentKitty大家经常用吧,呵呵,冷门视频资源搜索利器,当然你下载什么我管不了啊哈~除了torrentkitty,别的搜索服务比如豆瓣Top250、简书的七日热门什么的也类似,只要是比较规则存放的、防爬虫弱的大家举一反三,将需要的内容存放到数据库,方便后续分析,大数据、科学计算啥的。


PS1:代码中会写详细的注释,解释每一行是什么用途/为何这样写。
PS2:BeautifulSoup的语法确实比xpath更加简洁容易懂,理清思路,分步一步一步循序渐进,就能够得到解决方案。

0x1 注意事项及代码功能

1.本代码会将结果加入Mongodb数据库!!!
2.一定要注意Python的缩进,缩进是代码段完整及正确与否的标志,这个经常容易出错!!!
3.编辑器推荐Sublime Text直接可以运行代码,而且主题也很漂亮,不用拖着庞大的Pycharm,机器运行噪音太大。
4.本代码是python2的代码,python3不适用。
以下是代码编写开始设计的目标,历时大概3-4天,利用搜索引擎逐渐完善了代码功能。
#任务1:筛选文件大小满足条件的文件                                              <<<<<<OK!>>>>>>
#任务2:使用代理,而不是使用全局代理。使得其他软件的使用不受影响。                   <<<<<<这个暂时没实现,只是防止这个网址连接不上,我这不需要,因为SS可以搞定“墙”>>>>>>
#任务3:根据搜索内容,转换为正常字符,命名文件名保存,而不是每次都是同一个文件名。      <<<<<<OK!>>>>>>
#任务4:每20个链接保存一个文件,之后另增加文件保存。                               <<<<<<OK!>>>>>>
#任务5:将抓取内容存放到MySQL或者其他简单数据库。Monogodb                         <<<<<<OK!>>>>>>
#任务6:增加用户输入,然后搜索用户输入的内容。                                    <<<<<<OK!>>>>>>
#任务7:使用beautifulsoup方法实现抓取。实现高级筛选功能。                         <<<<<<OK!>>>>>>

0x2 需求分析及实现构思

torrent_to_mongodb设计流程图.gif
关键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
    torrent_to_mongodb.py运行效果图

0x5 参考链接:

  1. MongoDB与python交互
  2. MacbookPro,寒假想学下Python,用什么软件好一点?
  3. 你是如何自学 Python 的?
  4. python爬虫torrentkitty的种子
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容