Python爬虫入门(demo)

        上次更新有说尽量一周一更新,结果半个月没更新~主要原因是去打魔兽怀旧服以及二刷了一遍雪中悍刀行(偶尔人也得放松下)。当然也不是没学习,通过B站看了python游戏脚本的制作,主要是通过pyautogui这个库去进行鼠标以及键盘的操控,通过cv2库去进行图片的识别。看完后去制作了一个简单的脚本(识别图标后自动点击功能),原意是准备去做一个魔兽怀旧服的自动钓鱼脚本,但是做到一半发现里面的逻辑没有之前想的那么简单,里面的具体逻辑复杂,自己玩过魔兽怀旧服的人可以琢磨琢磨。很难短时间去写完脚本加上我游戏两个角色基本毕业对G币没需求导致我放弃了游戏脚本转而去学习了下爬虫。

        爬虫简而言之就是通过requests库去发送请求后得到返回后处理返回值。

一、发送请求

        有编程基础的这个基本都不用讲,但是需要注意的是发送请求的时候需要去填写一些特定的请求头去模拟浏览器发送。有一个比较好的妙招推荐:

                                

        这个是谷歌的网页调试,右键请求后找到图上面的红框选项然后点击复制。

        然后进入网站Convert curl commands to code将复制的粘贴,会生成相对应的请求代码。接下来直接拿着用就行了。

二、处理返回值。

        一、返回值是动态数据的。返回值没有加密的就没什么需要去讲解,直接在请求后面.json()方法然后对里面的值进行取值筛选即可,例如response['Data']。比较麻烦的是前端对返回值进行了加密,例如:下图:

        

        js常见的对称加密算法:AES,DES,下面会讲些一下AES。(解密中还有js混淆的问题,目前还没学到如何解决,后续学到会写一篇)

        (1)、解密AES的第一步是去在浏览器的js代码中去定位到加密的代码。首先点击1红框中的三个点然后找到search,然后在输入框输入decrypt( ,搜索到下面的js文件挨个去查看。这里需要大家有点js基础可以看懂代码。经过查看很明显红框中的那段代码就是加密的代码,方法有入参返回值,还有AES这种醒目的标志。

        (2)、改造代码。将框中的代码和返回密文复制到本地进行调试。期间会有很多报错。慢慢去调试就可以。具体的调试过程我这边就不去详细描写了,基本都可以百度到答案,也有一种比较偷懒的方法:直接gpt去弄一段js的AES加密代码对着改造。

下面是一段gpt编写的AES加密:

// 导入CryptoJS库
var CryptoJS = require("crypto-js");

// 定义密钥和待加密的数据
var key = CryptoJS.enc.Utf8.parse("1234567890123456");
var data = "Hello, World!";

// AES加密
var encrypted = CryptoJS.AES.encrypt(data, key, {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
});

// 获取加密后的密文
var ciphertext = encrypted.toString();
console.log("加密后的密文:", ciphertext);

// AES解密
var decrypted = CryptoJS.AES.decrypt(ciphertext, key, {
 在JavaScript中实现AES加密算法可以使用CryptoJS库。CryptoJS是一个流行的JavaScript加密库,提供了多种加密算法,包括AES。

以下是使用CryptoJS库在JavaScript中实现AES加密算法的示例:

```javascript
// 导入CryptoJS库
var CryptoJS = require("crypto-js");

// 定义密钥和待加密的数据
var key = CryptoJS.enc.Utf8.parse("1234567890123456"); // 16字节的密钥
var data = "Hello, World!";

// AES加密
var encrypted = CryptoJS.AES.encrypt(data, key, {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
});

// 获取加密后的密文
var ciphertext = encrypted.toString();
console.log("加密后的密文:", ciphertext);

// AES解密
var decrypted = CryptoJS.AES.decrypt(ciphertext, key, {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
});

// 获取解密后的原始数据
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);
console.log("解密后的原始数据:", plaintext);

        很明显将浏览器中的h.a替换成CryptoJS就可以了,同时需要去下载 crypto-js库替换完成后执行代码会发现有报错,即r["e"]和r["i"]这两个变量没定义的报错,这时候去浏览器进行断点调试。重新刷新后去查看到两个变量的值复制进代码。这时候再运行就会发现ok了。

        替换后代码:

const CryptoJS=require('crypto-js')
function b(t) {
    var e = CryptoJS.enc.Utf8.parse('EB444973714E4A40876CE66BE45D5930')
        , n = CryptoJS.enc.Utf8.parse('B5A8904209931867')
        , a = CryptoJS.AES.decrypt(t, e, {
        iv: n,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return a.toString(CryptoJS.enc.Utf8)
}

然后就是需要再python中可以去运行js代码。这里使用到了pyexecjs2库,下载完后导入库。

with open('aes.js', 'r', encoding='utf-8') as f:
    js_file = f.read()
result = execjs.compile(js_file).call('b', response['Data'])

代码内容:读取js代码,执行js文件中的b方法,传入参数为:response['Data']

这里就ok了。

        在查找加密代码位置的过程中可能会发生decrypt( 查找不到的情况,这时候可以通过关键词去一点一点查找。比如返回的密文是data的值,这时候我们就去搜索下data然后一步一步的看,会麻烦很多,但是没办法。相对来说返回data比较容易辨识的还是比较好处理的,也有些网站放回的是比较泛的变量名,例如返回变量名a。此时我们就需要去搜索JSON.parse,搜索这个词会发现有很多,下面有个方法可以快速的定位到我们需要的:

首先叉掉返回值的那个框,然后进入第二个图的js文件中去搜索。

        二、还有一种情况是返回的html这种,这种的话就是直接通过lxml库去进行解析。

res=requests.get(url).text
res.encode('utf-8')
html=etree.HTML(res)
imgUrls=html.xpath('//noscript/img/@src')

        上面是代码,讲编码转成是utf-8是为了解决乱码,然后将返回值转换为html,然后通过xpath去匹配取值,//是代表查找所有的这个标签,/是代表在查找的当前标签下,/@是指当前标签的的src值,总的来说就是可以去到下面代码中的src值。表达式就是取的<noscript>标签下的这种<img>标签中的src的值。<noscript>标签外面有很多层标签,所以//就是代表的无论多少层级,/代表当前层级。有兴趣可以自行取b站学习具体的匹配规则。

<noscript>
<img src="https://pic3.zhimg.com/v2-70267e57802a1ec11fd9667daf24c732_b.jpg" data-rawwidth="2418" data-rawheight="1280" data-size="normal" class="origin_image zh-lightbox-thumb" width="2418" data-original="https://pic3.zhimg.com/v2-70267e57802a1ec11fd9667daf24c732_r.jpg"/>
</noscript>

        然后推荐下一个b站的视频,个人觉得讲的还可以。我也是看的这个学的。

23.8【1-4】浏览器当中快速进行JS接口验证-合理化爬虫_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值