1、写在前面
最近看新闻说圣城家园(SCG)倒了,以前BT天堂倒了,暴风影音也不行了,能够说看个电影愈来愈费力,国内大厂如企鹅和爱奇艺最近也出现一些幺蛾子,虽然目前版权意识虽然愈来愈强,可是不少资源在这些主流视频网站上面依然没有,我平时看电影又习惯下载下来再看,因此每次看电影找资源就很麻烦,花了点时间,因而就有了这个程序。
c++
2、目的
输入一部电影的名字,帮我到BT之家上面看看有没有,若是有就把下载连接复制给我。工具
3、设计思路
原本想的是直接爬取首页最近发布的电影,而后取判断有没有,后来想了一下,为何不直接使用网站的搜索功能呢?网站
4、开始爬虫url
4.1.分析网站设计
打开网站搜索一个结果,发如今网址里面直接修改连接的内容就能到达搜索页面,那这样就更简单。
3d
先让用户输入一部电影的名字,直接生成连接。code
# 要求输入电影名 inputname = input('\n' + '请输入您要搜索的电影:') # 连接是用网站的搜索功能 url = "http://www.6btbtt.com/search-index-keyword-" + inputname + ".htm"
接下来再看搜索结果是什么样的,使用审查元素看看,就会看到搜索结果里面电影名字和连接会在一个a标签里面,类型为subject_link thread-old read
视频
至此网站就分析完成了xml
4.2.开始爬取过程htm
刚才已经获得了电影名和网站,那么下面直接得到搜索结果页面的内容就行,用requests获取内容,获取后顺便用beautifulsoup解析一下,解析后的东西就是有格式的,这样才能进行下一步操做。
# 获取网页内容并用beautifulsoup解析一下 soup = BeautifulSoup(requests.get(url).text,'lxml') # 给出找到第一个结果,网站搜索结果就是把最新的排在前面,因此一个结果就够了 movies = soup.find('a','subject_link thread-old')
然而如今咱们是获得一段内容,它不光包含电影标题和连接,还包含其余的东西,咱们要作的就是把电影标题和连接分别提取出来。
# 直接输出电影和连接 try: link = movies.get('href') name = movies.text ####这里用的是text,由于标签下面还有标签,是string没法获取文本内容 print('\n' + name) print(link + '\n') except: print("没有找到这部电影或程序发生未知错误")
这里用try和except来捕捉程序反馈,就是说假如获取的内容有问题,那程序不崩溃,就执行其余的或者进行下一步操做
至此,咱们已经获得了电影和连接了,爬虫过程也算结束了。
4.3判断爬取结果和用户输入
因为电影标题出来包含真正的电影名还包含清晰度、年代、格式等等这些信息,一般是这样的
[BT下载][小丑][BD- MKV/2.12GB][英语中英字幕][1080P][DC年度精彩大片蓝光版]
这些咱们都不要,在把它分割出来,单独取出电影名字,分割方法就是前面是 “下载][” 后面是“][”,取中间文本就能够。
# 这是用于从网页的电影标题里面分割出真正的电影名 def get_str_btw(s,f,b): par = s.partition(f) return (par[2].partition(b))[0][:] try: mname = (get_str_btw(name,"下载][","][")) except: print("没法匹配搜索结果")
单独取出电影名字后进行比对,这里只是简单地进行文字匹配,原本应该能够多爬取几个结果,而后模糊搜索进行匹配的。
# 判断输入的和获取到的电影名字是否匹配 if mname == inputname: print("电影有啦!连接已复制!祝您观影愉快!" + '\n') pyperclip.copy(link) else: print("我给您找到了这个!")
最后再加上一个让程序运行完等一下的命令
# 程序执行完不要立刻关闭窗口 os.system("pause")
至此,这个程序就完成了。
运行截图
五:注意事项
5.1.导入模块的时候若是发现不能导入,多是缺乏c++运行库,去下载官方工具安装就行;
5.2网站里面看似相同的元素标签可能不一样,好比那个热门电影和新电影标签不同,一开始遍历爬取的时候发现老是报错;
5.3必定要用tryexcept来避免出现意外;
程序可能没有意义,但生命不息,折腾不止。