吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5670|回复: 22
收起左侧

[Python 转载] 前后端分离,VUE.js+Flask,种子搜索网站源码

   关闭 [复制链接]
suyaming 发表于 2022-5-9 23:20

前言

这套源码只包含python部分,vue部分是编译后的。前端用的是vue和vueify还有axios。后端是Flask,楼主也是业余选手一个。代码不是很好看,目的还是分享一下学习的过程。这篇帖子,教程向较少,因为楼主文笔不是很好,有啥问题或者建议可以评论区交流。

首先先上后端部分代码

Python部分

爬虫代码

import requests
from bs4 import BeautifulSoup
from urllib.parse import quote
from multiprocessing.dummy import Pool as ThreadPool

def get_ip():
    resp = requests.get(
        '代{过}{滤}理api地址')
    return resp.text

class Spider:
    def __init__(self):
        ip = get_ip()
        self.proxies = {
            'http': 'http://' + ip,
            'https': 'http://' + ip
        }
        self.base_url = 'https://www.btbtt11.com'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
        }

    def search(self, keyword):
        keyword = quote(keyword)
        search_url = f'{self.base_url}/search-index-keyword-{keyword}.htm'
        resp = requests.get(search_url, headers=self.headers, proxies=self.proxies)
        soup = BeautifulSoup(resp.text, 'lxml')
        all_search_result = soup.find_all('table')
        search_list = []
        url_list = []
        for i in all_search_result:
            filter_one = i.find(attrs={'class': 'subject_link thread-old'})
            movie_name, movie_url = '', '',
            if filter_one is not None:
                movie_name = filter_one.text
                movie_url = filter_one.get('href')
                url_list.append(movie_url)
                search_list.append({'name': movie_name, 'url': movie_url})  # , 'bt_list': bt_list
        if search_list:
            pool = ThreadPool(30)
            results = pool.map(self.get_down_url, url_list)
            # close the pool and wait for the work to finish
            pool.close()
            pool.join()
            for k in range(len(search_list)):
                search_list[k]['bt_list'] = results[k]
            return search_list[1:]
        else:
            return None

    def get_down_url(self, url):
        get_url = f'{self.base_url}/{url}'
        resp = requests.get(get_url, headers=self.headers, proxies=self.proxies)
        soup = BeautifulSoup(resp.text, 'lxml')
        try:
            all_bt_resource = soup.find(attrs={'class': 'attachlist'}).find_all('a')
        except AttributeError:
            return None
        resource_list = []
        for i in all_bt_resource:
            bt_name = i.text
            bt_url = i.get('href').replace('dialog', 'download')
            resource_list.append({'name': bt_name, 'url': self.base_url + '/' + bt_url})
        return resource_list

由于网站有反爬机制,爬取过多时会报错,所以加了个代{过}{滤}理,这个大家自己用可以直接注释掉。由于一次性需要爬取的数据有点多,如果不用并行的话,会很慢。所以用了一个map。其他没什么特别的地方。

flask部分

from flask import Flask, request, jsonify
from spider.bt_spider import Spider
from flask_cors import CORS

app = Flask(__name__)
CORS(app, supports_credentials=True)

@app.route('/<path:fallback>')
def fallback(fallback):
    if fallback.startswith('css/') or fallback.startswith('js/') \
            or fallback.startswith('img/') or fallback == 'favicon.ico':
        return app.send_static_file(fallback)
    else:
        return app.send_static_file('index.html')

@app.route('/')
def hello_world():
    return app.send_static_file('index.html')

@app.route('/api/search')
def search_movie():
    search_keyword = request.args.get('keyword')
    search_resluts = Spider().search(search_keyword)
    if search_resluts is None:
        return jsonify({'status': 'error', 'reslut': 'No Result'})
    else:
        return jsonify({'status': 'ok', 'reslut': search_resluts})

@app.route('/api/download')
def download():
    down_url = request.args.get('url')
    down_resluts = Spider().get_down_url(down_url)
    if down_resluts is None:
        return jsonify({'status': 'error', 'reslut': 'No Result'})
    else:
        return jsonify({'status': 'ok', 'reslut': down_resluts})

if __name__ == '__main__':
    app.run()

CROS是为了解决跨域问题,也很简单其他没什么可说的。最后展示一下成品



2.png

另外我把这套代码部署到了服务器,大家可以在线体验下。不保证稳定性,也应该不会怎么维护。
http://129.226.40.25/

免费评分

参与人数 6吾爱币 +6 热心值 +4 收起 理由
shengforever + 1 谢谢@Thanks!
kuaileya + 1 厉害
HASsausage + 1 + 1 用心讨论,共获提升!
东南又东北 + 1 + 1 谢谢@Thanks!
hnwang + 1 + 1 我很赞同!
d8349565 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| suyaming 发表于 2022-5-9 23:47
蓝奏云 https://suyaming.lanzouf.com/idTjE04kdwmh
 楼主| suyaming 发表于 2022-5-9 23:28
源代码,可以直接部署到服务器

flaskProject.zip

1.14 MB, 下载次数: 32, 下载积分: 吾爱币 -1 CB

E式丶男孩 发表于 2022-5-9 23:35
E式丶男孩 发表于 2022-5-9 23:42
suyaming 发表于 2022-5-9 23:28
源代码,可以直接部署到服务器

下载不了
 楼主| suyaming 发表于 2022-5-9 23:48

https://suyaming.lanzouf.com/idTjE04kdwmh
XiaoZouYu 发表于 2022-5-10 08:37
python小白来学习哈,顶楼主
头像被屏蔽
xiadongming 发表于 2022-5-10 08:43
提示: 作者被禁止或删除 内容自动屏蔽
hnwang 发表于 2022-5-10 08:50
感谢分享,必须学习下
小丑恶人 发表于 2022-5-10 08:55
可以可以,学习一波
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表