分类 瞎折腾 下的文章

使用python批量下载PT站小种


学习python也有十来天了,是时候找个东西练练手了
想来想去还是写爬虫比较实用,一开始写了个爬妹子图的(话说这网站是真的惨,每个刚开始学爬虫的都要拿它练练手)不过不小心手一抖给删了。
然后就萌生了爬pt站的想法。

代码如下:`

import requests
import os
import re
import lxml
import bs4
import time
num = []
def login_info2(str2,username,password):
    s = login_info(str2,username,password)
    passkey = get_passkey(str2,s)
    print('你的passkey是:',passkey)
    print('你需要下载几页种子?(每页种子的个数见站点设置,第一页不包含置顶种子)')
    page_quantity = input()
    page_quantity = int(page_quantity)
    get_torrent_id(str2,s,page_quantity)
    download_torrent(str2,s,passkey)

def login_info(str2,username,password):
    print(str2)
    header['origin'] = str2
    header['referer'] = str2 + '/login.php'
    form_data['username'] = username
    form_data['password'] = password
    url = str2 + '/takelogin.php'
    s = requests.session()
    s.post(url ,data = form_data,headers = header)
    return s

def get_passkey(str2,s):
    url_user = str2 + '/usercp.php' 
    html = s.get(url_user,headers = header)
    x = re.findall(r'[a-z0-9]{32,50}',html.text)
    for i in x:
        if len(i) == 32:
            return i
def get_torrent_id(str2,s,page_quantity):

    for i in range(page_quantity):
        temp = i
        small_torrent_url = str2 +'/torrents.php?inclbookmarked=0&incldead=1&spstate=0&&sort=5&type=asc&page=' + str(i)
        print(small_torrent_url)
        html = s.get(small_torrent_url,headers = header)
        if str2 =='https://ourbits.club':
            soup = bs4.BeautifulSoup(html.content, 'lxml')
            a =  soup.find_all('tr',class_='sticky_blank')
            for i in range(0,len(a),2):
                str1 = str(a[i])
                b = str1.find('download.php?id=') + 16
                c = str1.find('"',b)
                num.append(str1[b:c])
        else:
            x = 0
            str_html = html.text
            a = str_html.find('置顶') + 2
            str_html = str_html[a:]
            while(a!=1):
                a = str_html.find('置顶') + 2
                str_html = str_html[a:]
                x+=1
            else:
                if x!=0:
                    x = x-1
                for i in range(50-x):
                    b = str_html.find('download.php?id=') + 16
                    c = str_html.find('"',b)
                    num.append(str_html[b:c])
                    str_html = str_html[c:]
                if temp == 0:
                    del num[0]


def download_torrent(str2,s,passkey):
    os.mkdir('Z:\\torrent')
    os.chdir('Z:\\torrent')
    for torrent_id in num: 
        download_torrent_url = str2 + '/download.php?id=' + torrent_id +'&passkey='+passkey+'&https=1'
        print(download_torrent_url)
        torrent = s.get(download_torrent_url,headers = header)
        time.sleep(15)
        name = str(torrent_id) + '.torrent'
        with open(name,'wb') as f:
            f.write(torrent.content)

www = {
    'Ourbits':'https://ourbits.club',
    '动漫花园u2':'https://u2.dmhy.org'
}

form_data = {
        'username': '',
        'password': '',
        '2fa_code': '',
        'trackerssl': 'yes',
        }
header = {
        'cookie':'',
        'dnt': '1',
        'origin': '',
        'referer': '',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
    }

def login():
    print('输入要登陆的站点:\n1.Ourbits\n2.动漫花园u2')
    num = input()
    print('等待一下,时间视网速而定...')
    if num == '1':
        print('输入账号:')
        username = input()
        print('输入密码:')
        password = input()
        str2 = www['Ourbits']
        print('输入cookie:')
        cookie = input()
        header['cookie'] = cookie
        login_info2(str2,username,password)
    elif num == '2':
        print('输入账号:')
        username = input()
        print('输入密码:')
        password = input()
        print('输入cookie:')
        cookie = input()
        header['cookie'] = cookie
        str2 = www['动漫花园u2']
        login_info2(str2,username,password)
    else:
        print('你要输入一个正确的选项')
    login()
login()

支持ourbits和u2,馒头其实也可以不过得把get_torrent_id函数里的"置顶"换成繁体的,然后改一下相关链接就ok了。默认保存在Z盘的torrent文件夹(运行程序之前不能有该文件夹,否则会报错),设置的是每15秒下载一个种子,因为有些PT站(比如ourbits,u2在短时间内请求次数过多也会被关闭连接)限制了每分钟能够下载的种子数。


爬取pixiv每日排行榜并上传到OneDrive


最近闲的无聊想找点图看,然后想到了pixiv。说到爬虫自然就是python了。先上github看看有没有现成的。

找到一个,那我也不用自己写了。github:https://github.com/Neod0Matrix/PixivCrawlerIII

因为项目用的是python3,所以先装好python3.在此处不做说明。

  1. 爬取项目到本地

    git clone https://github.com/Neod0Matrix/PixivCrawlerIII.git
    cd PixivCrawlerIII
    pip3 install -r requirements.txt     //安装依赖
  2. 运行脚本并配置

    python3 pixivcrawleriii.py

    按照提示信息配置好就行了。

  3. 相关命令行

    抓取某个画师的全部图片,xxxx是画师id

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 2 -i XXXX

    抓取当天r 18排行版

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 2 -l 1 -s 0

    抓取本周r 18排行版

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 2 -l 2 -s 0

    抓取当天普通排行版

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 1 -l 1 -s 0

    抓取本周普通排行版

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 1 -l 1 -s 0

    抓取本月普通排行版

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 1 -l 3 -s 0
  4. 注意事项
    抓取的文件位置

    /sdcard/Pictures/Crawler

到这里为止爬取的部分就结束了,然后想要上传到onedrive的话,有很多如oneindex,PyOne之类的可以拿来用,这里我们用PyOne来举例

环境配置

Github地址:https://github.com/abbeyokgo/PyOne
首先得配置环境,嫌麻烦的可以安装宝塔面板。如何安装这里不做说明。
环境要求:Python2.7、Redis、Mongodb、Nginx
安装好上面的东西后,从github把项目拉下来。
  1. 安装

    git clone https://github.com/abbeyokgo/PyOne.git
    cd /root/PyOne
    pip install -r requirements.txt    //安装依赖
    #复制配置文件
    cp self_config.py.sample self_config.py
    cp supervisord.conf.sample supervisord.conf

    如果当前不是在root目录下,则需要修改self_config.py的config_dir参数和supervisord.conf的directory参数为正确的目录!

  2. 运行

    gunicorn -w4 -b 0.0.0.0:34567 run:app

    如果没有报错的话,访问网页,然后把命令放到后台就可以了
    后台默认密码是PyOne
    然后添加网盘授权,如何授权此处不做说明,网页端有提示。

  3. 计划任务
    在宝塔的计划任务里添加如下代码,你也可以用其他方法实现计划任务。
    P站的排行榜是每天中午12点刷新,所以建议把运行脚本的时间设置为每天中午12点后。

    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 2 -l 1 -s 0
    mv /sdcard/Pictures/Crawler /任意文件夹/r18
    python /root/PyOne/function.py UploadDir /任意文件夹/r18 /R18 C
    cd /root/PixivCrawlerIII&&python3 pixivcrawleriii.py -m 1 -r 1 -l 1 -s 0
    mv /sdcard/Pictures/Crawler /任意文件夹/r16
    python /root/PyOne/function.py UploadDir /任意文件夹/r16 /R16 C
    python /root/PyOne/function.py UpdateFile
    rm -rf /任意文件夹/*

    以上代码视情况自行修改。


搭建无污染dns


        起因:

     前段时间u2被dns投毒了,然后就想着能不能自己建一个dns。

首先要准备一台在国内的服务器 ,或者刷了openwrt之类的路由器也行。

        然后先搭建chinadns作为上游dns。

     Github地址:https://github.com/shadowsocks/ChinaDNS

        先下载编译chinadns

    wget --no-check-certificate  https://github.com/shadowsocks/ChinaDNS/releases/download/1.3.2/chinadns-1.3.2.tar.gz
    tar -zxvf chinadns-1.3.2.tar.gz
    cd chinadns-1.3.2
    ./configure && make

        然后更新CHNRouter

    curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt

        开启

    ./src/chinadns -m -c chnroute.txt -s 119.29.29.29,208.67.220.222:443

        这里默认开启的是53端口,要注意的是记得打开防火墙,阿里云之类的服务商还得打开安全组的udp和tcp端口。

        访问http://tool.chinaz.com/dns/?type=1&host=你想解析的域名&ip=服务器的ip看看能不能用,如果响应ip那里啥也没有请检查服务是否出错和防火墙的配置是否有问题。

        确认无误后把chinadns用5353端口启动就行了。注意,终端退出的话chinadns也会停止,具体解决方法有很多,随便找一个用就是了。

        然后安装DNSMasq。至于是编译安装还是用包管理器安装随便,这里就不说了。

        安装完后编辑/etc/dnsmasq.conf文件

    # 指定监听 53 端口

      port=53
    # 禁止 DNSMasq 使用 resolv.conf
      no-resolv
      no-poll
    # 指定监听IP,将 x.x.x.x 换成你的 eth0 网卡IP(用 ifconfig 命令查看)
      listen-address=127.0.0.1,x.x.x.x
    # 指定额外配置文件夹
      conf-dir=/etc/dnsmasq.d/

          需要注意的是,如果你是想把这个dns服务用于公网,后面那个x.x.x.x是必须要加的。127.0.0.1是让本地访问。<br/>

          添加chinadns作为上游dns服务器

                echo "server=127.0.0.1#5353" > /etc/dnsmasq.d/chinadns.conf

           然后重启DNSMasq就行了。


[记]typecho发布文章和设置伪静态时404错误


       今天想要给博客设置伪静态时发现,只要我点了"保存设置"按钮,就会跳到一个类似https://XXXXXX/index.php/action/options-permalink?_=XXXXXX的链接。而且在发布文章时也会跳转但是文章可以发布出去。在查阅资料后一开始以为是pathinfo没有设置好,但检查后发现没有毛病。查看了数据库日志后发现只要我试图启用伪静态和发布文章,数据库就会出现Got an error reading communication packets的错误。不过我并没有办法解决。。。。翻阅了github后发现也有人出现了这个问题但是没有给出答案。我觉得可能和数据库有关,然后在typecho的论坛和思否都看见了有两个人提出了两种不同的解决办法。思否里的人更换了使用的面板(原宝塔面板,我也是这个)后问题解决。论坛里的老哥在排查了文件和php后也查到了数据库上,他清空了数据库后问题解决。原文链接(注:伪静态规则设置后还是打不开,会出现502错误。)

我懒得换面板也懒得重新弄数据库(逃233)。这个问题就鸽了吧。。。记一笔以后有时间再弄吧。

综上,问题解决的思路应该在数据库那边。。