记录一下python写爬虫必须要注意的几个点

因为好久没写过爬虫了,这次单位有需求要爬取几TB的资料,在测试过程中遇到一些问题,总结下来,未来写爬虫的时候可以避坑。

问题1:JSON Object Key不存在。规范的情况下,返回的JSON对象数组应该是统一的,即使数据不存在也应该是空字符串或者null或者别的什么,但是这个系统过于老旧,编码也乱七八糟不规范,导致个别数据不存在的时候,压根不返回这个Key。

解决方案:

if 'key' not in item:
    continue

只需要判断一下这个key在不在item里,不在直接跳出此循环。

 

问题2:保存的文件名/路径有非法字符。在Windows下,创建的文件夹/文件时,文件名不能包含以下字符:

 \ / : * ? " < > |

因此,如果文件名/路径名中有此些字符,需要替换掉,这里提供一个替换方法:

def string_format(str: string, replacement: string=''):
    illegal_words = ['\\', '/', '*', '?' '"', '<', '>', '|']
    for word in illegal_words:
        if word in str:
            str = str.replace(word, replacement)
    return str

参数说明:str 要格式化的字符串,replacement 将非法字符替换成指定内容,不填写则替换空字符串。

青骄第二课堂全国青少年禁毒知识一键满分脚本

[admonition]转载请保留出处,严禁倒卖,倒卖者亲🐴biss[/admonition]

前言

去年发过的禁毒知识竞赛的满分脚本,今年还能用。重新发布一下。

按照下面使用方法使用可一键满分,不用进去答题。

有问题请进QQ群交流:1153448795

效果图:

使用方法

1、登录https://www.2-class.com/competition

2、按F12打开开发者工具,选择应用(Application) -> 左侧Cookie加号点开 -> 选择https://www.2-class.com/

3、复制右侧的asw_tcsid的值

4、切换回控制台(Console) -> 在下方输入框里输入命令:window.__DATA__.reqtoken 并回车

5、复制双引号内的内容

6、运行脚本,依次输入以上3个数据。

 

代码

# -*- coding: utf-8 -*-

import requests
import json
import time
import random


# 获取reqtoken的命令: window.__DATA__.reqtoken

# cookie = 'acw_tc=76b20f6616659797159527027e3350e04399c20a051cfaf70874ad516c6900; sid=e993abc8-00ee-4173-9c36-abd5d059babd;'
# reqtoken = '9f83d24e-7e12-4c47-a45b-b677694fa7a3'


def yi_jian_man_fen(cookie, reqtoken):
    url = 'https://www.2-class.com/api/quiz/commit'
    headers = {
        'Cookie': cookie,
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
    }
    time = random.randint(100, 350)
    data = {
        "list": [
            {
                "questionId": 2986,
                "questionContent": "B"
            },
            {
                "questionId": 2989,
                "questionContent": "C"
            },
            {
                "questionId": 2990,
                "questionContent": "D"
            },
            {
                "questionId": 2959,
                "questionContent": "C"
            },
            {
                "questionId": 2928,
                "questionContent": "C"
            },
            {
                "questionId": 2960,
                "questionContent": "A"
            },
            {
                "questionId": 2961,
                "questionContent": "C"
            },
            {
                "questionId": 2897,
                "questionContent": "B"
            },
            {
                "questionId": 2930,
                "questionContent": "D"
            },
            {
                "questionId": 2898,
                "questionContent": "B"
            },
            {
                "questionId": 2963,
                "questionContent": "A"
            },
            {
                "questionId": 2932,
                "questionContent": "D"
            },
            {
                "questionId": 2901,
                "questionContent": "A"
            },
            {
                "questionId": 2966,
                "questionContent": "D"
            },
            {
                "questionId": 2934,
                "questionContent": "C"
            },
            {
                "questionId": 2904,
                "questionContent": "D"
            },
            {
                "questionId": 2907,
                "questionContent": "D"
            },
            {
                "questionId": 2972,
                "questionContent": "C"
            },
            {
                "questionId": 2973,
                "questionContent": "A"
            },
            {
                "questionId": 2912,
                "questionContent": "B"
            }
        ],
        "time": time,
        "reqtoken": reqtoken
    }

    result = requests.post(url=url, data=json.dumps(data), headers=headers, verify=False)
    print(result.text)


if __name__ == '__main__':
    acw_tc = input('请输入acw_tc:')
    sid = input('请输入sid:')
    reqtoken = input('请输入token:')
    cookie = f'acw_tc={acw_tc}; sid={sid};'
    yi_jian_man_fen(cookie, reqtoken)

 

其他

不欢迎任何商业行为。

司马52pojie,10年多了,封我账号,祝52pojie早日倒闭。

[python] openpyxl 的一些使用上的小问题记录一下

1、获取sheet直接使用数组形式:

sheet = work_book['Sheet0']

2、取单元格值是value

some_value = sheet.cell(row=1, column=1).value

3、遍历行 列的方法

# 这个的索引是从1开始的,最后max+1是为了最后一行可以匹配到

# 遍历行
for row in range(begin_row_index, sheet.max_row + 1):
 # some code
 break

# 遍历列

# 遍历行
for column in range(begin_column_index, sheet.max_column + 1):
 # some code
 break

4、填充,字体等设置方法

# 设置颜色 具体函数内容请阅读文档
sheet.cell(row=1, column=1).font = Font(color='FF0000')

# 设置填充
sheet.cell(row=1, column=1).fill = PatternFill(patternType='solid', fgColor='FF0000')

 

青椒第二课堂禁毒知识比赛一键满分脚本

大家好,我又来了,昨天发了普法的脚本之后,有几个朋友私信我想找这个青椒第二课堂禁毒知识的脚本,就晚上没事简单看了看
这个脚本跟普法的原理是一样的,用一套做满分的payload重复提交。
下面python代码自取。


几个说明:
1、cookie获取:浏览器进www.2-class.com 开F12开发者工具,登录后随便刷新下网页,找个请求,复制里面请求Header里的cookie内容。是类似于aliyungf_tc=b*******cb6902f3f90635557533a17c27047; acw_tc=2f*****837535aa37366a7fb8b1c7; sid=aeb******887f0075
这样的字符串
2、reqtoken获取:接第一步,开发者工具里点Console(控制台),输入window.__DATA__.reqtoken,然后复制引号内的内容
3、在脚本里填入以上内容,完毕


然后执行一下就可以了。。

注意:52pojie和本站发布的均为同一作者zjh4473

# -*- coding: utf-8 -*-

import requests
import json
import time
import random

# 获取reqtoken的命令: window.__DATA__.reqtoken

cookie = ''
reqtoken = ''


def yi_jian_man_fen():
    url = 'https://www.2-class.com/api/quiz/commit'
    headers = {
        'Cookie': cookie,
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
    }
    time = random.randint(100, 350)
    data = {
        "list": [
            {
                "questionId": 2986,
                "questionContent": "B"
            },
            {
                "questionId": 2989,
                "questionContent": "C"
            },
            {
                "questionId": 2990,
                "questionContent": "D"
            },
            {
                "questionId": 2959,
                "questionContent": "C"
            },
            {
                "questionId": 2928,
                "questionContent": "C"
            },
            {
                "questionId": 2960,
                "questionContent": "A"
            },
            {
                "questionId": 2961,
                "questionContent": "C"
            },
            {
                "questionId": 2897,
                "questionContent": "B"
            },
            {
                "questionId": 2930,
                "questionContent": "D"
            },
            {
                "questionId": 2898,
                "questionContent": "B"
            },
            {
                "questionId": 2963,
                "questionContent": "A"
            },
            {
                "questionId": 2932,
                "questionContent": "D"
            },
            {
                "questionId": 2901,
                "questionContent": "A"
            },
            {
                "questionId": 2966,
                "questionContent": "D"
            },
            {
                "questionId": 2934,
                "questionContent": "C"
            },
            {
                "questionId": 2904,
                "questionContent": "D"
            },
            {
                "questionId": 2907,
                "questionContent": "D"
            },
            {
                "questionId": 2972,
                "questionContent": "C"
            },
            {
                "questionId": 2973,
                "questionContent": "A"
            },
            {
                "questionId": 2912,
                "questionContent": "B"
            }
        ],
        "time": time,
        "reqtoken": reqtoken
    }

    result = requests.post(url=url, data=json.dumps(data), headers=headers, verify=False)
    print(result.text)


if __name__ == '__main__':
    yi_jian_man_fen()

 

第三届全国应急管理普法知识竞赛每日刷分脚本

# -*- coding: utf-8 -*-

import requests
import json
import time

auth = '这里填入你的 AuthorizationLg 值'


def dian_zan():
    url = 'http://www.gsosc.cn/prod-api/app/mark/save'
    headers = {
        'AuthorizationLg': auth,
        'Content-Type': 'application/json'
    }
    for num in range(1, 11):
        if num < 10:
            num = '00' + str(num)
        elif 10 <= num < 100:
            num = '0' + str(num)
        data = {
            'projectId': 'emd2021',
            'contentId': f'lesson{num}',
            'type': 'lesson',
            'mark': 1
        }
        # print(json.dumps(data))
        result = requests.post(url=url, data=json.dumps(data), headers=headers)
        print(result.text)


def da_ti():
    url = 'http://www.gsosc.cn/prod-api/app/bzCeShi/saveJJLUserAnswer'
    headers = {
        'AuthorizationLg': auth,
        'Content-Type': 'application/json'
    }
    data = {"projectId": "emd2021",
            "json": "{\"answer\":\"1189f2f0d84e4409a780eb7ae811ceaa#A#17947##832d3802aa394bf98e3a4582831204de#B#5571##640edb8475c34722b32cb3169a13432d#A#5005##1856459845594747bb07abae6395628e#A#3862##8f371cb745c4492da9e7b3d59fdc5e06#A#2214##\",\"time\":45191}",
            "dtId": "emd2021_jlldt"}

    for num in range(0, 5):
        result = requests.post(url=url, data=json.dumps(data), headers=headers)
        print(result.text)
        time.sleep(3)


def study():
    dian_zan()
    da_ti()


if __name__ == '__main__':
    study()

单位让全员搞这个,没办法只能写个这玩意了。
小伙伴们可以把这个做成云函数,每天执行一次就可以了。
很简单的代码,功能分别是每天点10个赞(最多也就10个)和集训营5次满分
自己抓包将AuthorizationLg 的值填到开头的auth 里,类似于Bearer eyJhbGciOiJ********AmBaUBd55vahMRR4YHeQ9e5sA******ra6Tr0T2o8rW0yw 这么个字符串,很长。
也可以自己手动搞,看我这个帖子:https://www.52pojie.cn/thread-1532067-1-1.html

实战营和决战营还没开,开了之后我再更新下。

注意:52pojie和本站发表的帖子为同一个作者。

再见Python《Python从入门到卸载》

前言

兴致勃勃学了一周的py基础知识,也从0开始成功编写了py爬虫,但我毕竟还是个搞web设计的,怎么能轻易离开老本行呢。所以我就开始着手学习django

Django

这TM什么反人类东西啊。我跟着教程一步步创建好项目,设置好导入,配置好incloud,各种东西,然后教程告诉我该测试运行了,然后我兴致勃勃的

[python]python3 manage.py runserver

[/python]

然后给我报了整整18条错误(我没截图,但是我真的不知道我哪里写错了)。

按着教程一步步走,有些地方教程版本比较老了,比如教程里还是url(),而现在已经是path()了,但不管怎么样,就是无法运行,项目都创建不了更别说继续写下去了。

再见python

于是乎,我就卸载了Pycharm,卸载了Python3 删掉了项目文件。。。。

未来

作为一个电力专业的前段web设计者,不像全职设计一样有充足的时间去学习和制作,我接下来会尝试 spring boot (一个学java的同学推荐的),如果还是不尽人意,我真的要回去认真学TP5了,唉。

不是我没有毅力,如果接下来的spring boot 简称sb ,在部署,设计,运行上和php不相上下或者感觉还是php好(我真的还没开始碰sb),我还是回去认认真真给我php学完。之前的博客还会留着,再怎么样,也是学了,学了东西一定不能忘记。

看来成为后端程序员还有很长的路要走啊。

【Python】关于index()方法及切片功能的一些小细节

前言

由于我今天要练手做一个获取指定两文本之间的内容(取出中间文本),所以用到了index()方法
在使用过程中,碰上几个有趣的问题,我决定记录一下保证以后不会再出现!

这里是事情经过

我要获取的是全民K歌分享歌曲的真实下载链接,在经过各种网页分析之后(此处忽略一万字网页分析过程,如果你有需要我可以在另开文章写,很简单),我需要取出 “playurl”:”  至 “, 之间的内容,也就是歌曲链接啦。先贴上我刚开始写的代码(其实是网上copy过来再改改的

[python]begin = data.index(‘"playurl":"’) + 1
end = data.index(‘",’, begin)
play_url = data[begin:end][/python]

执行后得到如下结果

playurl”:”http://dl.stream.kg.qq.com/szkge/5f1df0f6432bd9287e866f1142a6f99780d859e0?ftnrkey=7a039fed55b00c20be61cf2da649f4f57a9f9d55129571b7959260f624d28ea217e4370a39ba0e79415a1d832047ed1a3468428a3711c3e321cd2e008d9d3ffc&vkey=87B8FA7323B449912EA32D8D9C5105A32BFBD78D0C5D75F94F41ECC603FE43FB750FD87037555B2E2ED2F07263FF7B41AD1359DC5EF4B74B9A70BEBF5A55490411EAAACD5C675A4C8FF4A0764E2B79D1A14C4EDE61D5B35D&fname=1021_e9638deee080f1bb547e47ef80f987fc618188ad.0.m4a&fromtag=1506&sdtfrom=v1506

而我想要的是从http开始的内容,所以我测试了半天,发现是那个 +1 的问题。
原来,index()获取到索引后,默认是最左边一个字符的索引,也就是上文代码中的 ” 所在的索引,我们+1后,就变成了p所在索引,因此执行后出现第一个引号消失了而从p开始算
明白了原因,就可以解决了。很简单,直接获取+自身长度即可。修改后代码如下

[python]begin = data.index(‘"playurl":"’) + len(‘"playurl":"’)
end = data.index(‘",’, begin)
play_url = data[begin:end][/python]

也就是把+1 改成了 +len(‘”playurl”:”‘) ,这样在执行结果如下

http://dl.stream.kg.qq.com/szkge/5f1df0f6432bd9287e866f1142a6f99780d859e0?ftnrkey=ffa2360d2a287aad928b4cdb7bfd8132b814c4f2d8e919b74f26bd37b0e4470d80469ae091b6fe35ce30d45fffb9a782e777045217f9011dda9b2a2bd42f7a1a&vkey=E698512E5CB7A541942685C77FBF1068235409934EF5E3F13B498DDFCD2965C24E2ACB8C7B2126700222961FB84FD640356A0A2DB38B82D6111AEBDDD7797F9DE1A6B2C69311E2D9A202C1A06DCE2BC821385A70DBF73824&fname=1021_e9638deee080f1bb547e47ef80f987fc618188ad.0.m4a&fromtag=1506&sdtfrom=v1506

Perfect,完美达到预期。

结束

今天就到这吧,明天继续把这个小爬虫写完,不过怎么还是觉得易语言方便些呢。可能习惯了吧!

在MacOs安装pip 及各种问题解决

安装方法

在使用brew安装的时候出现未找到pip,然后发现是因为brew默认在执行brew install python的时候会自带pip??不太懂。但是pip又提示command not found。没办法只能用下面语句安装

[shell]sudo easy_install pip[/shell]

成功安装,这时我们执行

[shell]pip -V[/shell]

查看版本,发现竟然TMD安装到了系统的2.7版本py里,这不是我想要的结果

因为我开发是用python3.7(可以参考我的另一篇博文https://blog.zixutech.cn/archives/106 来查看如何在macos上安装双版本py)

所以pip必须为3.7服务,这样一来默认的指令 pip install xxx 就不能用了。

有两种方法可以为3.7版本装包

方法1

首先查看py3.7的包文件夹路径

终端以此执行

[shell]$ python3
>>> import sys
>>> print(sys.path)[/shell]

得到如下结果

复制最后一个路径,我的是

/usr/local/lib/python3.7/site-packages

然后就可以开始执行安装指令了

[/shell]pip install -t /usr/local/lib/python3.7/site-packages/ 包名[/shell]

然后你的包就会安装在-t后面指定的位置了。

 

方法2

由于方法1比较复杂,这里推荐方法2

直接终端执行

[shell]python3 -m pip install 包名[/shell]

也是可以顺利安装的。

总结

至此,pip及未来的包安装都弄好了。略略略

 

 

在Mac上兼容安装Python3并保留原先的Python2.7

前言

博主的电脑为2017款macbook pro ,电脑自带python2.7版本,在网上查资料得知由于很多系统服务依赖于自带的2.7py,所以不敢卸载,因此只能安装双兼容python,这里以Python3.7版本为例。

1、安装Xcode Command Line Tool

在网上查资料,好多都说要先从App Store里装Xcode应用才能装这个Tool,但是经过测试发现,压根不需要。这下就省了5个多G的下载时间

打开终端,执行以下命令安装Xcode Command Line Tool

 

xcode-select --install

 

安装是可视化的,会持续一段时间,耐心等待安装完毕即可

 

2、安装HomeBrew

这是一个Mac平台上很不错的下载源,很多软件可以直接使用brew安装,很省事。

Home Brew官网:https://brew.sh/index_zh-cn

官网首页就有安装指令,直接复制进终端即可。

安装完毕后可以在终端输入以下命令测试是否安装成功

 

brew doctor

 

如果提示

 

Your system is ready to brew.

则表示安装顺利成功,如果出现错误或警告,按照提示进行修复即可。

 

3、安装Python

做完前两步之后,就很简单了,直接在终端输入:

 

brew search python

会出现如下结果

 

可以看到我的python打对勾了,说明安装过了,接下来执行:

 

brew install python

注意:不要管其他的,你只需要安装这个。

 

稍等片刻就会安装完成。

4、设置$PATH变量

这一步不是每个人都要设置,执行下面指令查看是否需要设置$PATH

 

echo $PATH

注意,区分大小写

 

如果执行后显示的类似于

 

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

则你不需要设置,直接跳到第5步。

 

如果你的显示的类似于

 

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

则你需要设置,继续看即可。

 

TIPs:简单来说,如果你的PATH第一条不是/usr/local/bin 就需要设置!

更改$PATH内容

执行

 

sudo vim /etc/paths

将内容里的/usr/local/bin 移动到第一行

 

也就是像我这样

更改完毕后保存退出。这时需要重启终端才能看到改变,重启终端后,再次执行

 

echo $PATH

查看是否已经变成你修改后的样子。

 

至此,安装完成!

5、查看电脑安装的Python版本

此时你可以执行

 

which python
which python3
which python3.7

执行后查看是否输出/usr/local/bin

 

查看各个python的版本只需要这样执行(其他都一样,数字改改就行)

 

/usr/local/bin/python3 --version

大功告成!!开发去咯!!!