Python网络爬虫过程中,构建网络请求的时候,参数`stream=True`的使用

大家好,我是皮皮。

一、前言

前几天在Python最强王者交流群【德善堂小儿推拿-瑜亮老师】分享了一个关于Python网络爬虫的问题,这里拿出来给大家分享下,一起学习。

二、解决过程

这里【PI】大佬提出了思路,的确可行。

【皮皮】给了一份代码,取巧,这里就不展示了。后来【月神】给了一份可行的代码,如下所示:

for url in all_url:
    resp = requests.get(url, headers=header, stream=True)
    content_length = resp.headers.get('content-length')
    if content_length and int(content_length) > 10240:
        print(url)

程序运行之后,不到1秒就出来结果了,没想到jupyter里边可以自动显示时间,以前也有看到,但是没有留意,Pycharm里边是没有的,这里来看,jupyter还是蛮香,Pycharm还得自己设置打印时间。

【月神】的方法完全满足题目要求,不过这个文件解析有点慢。

后来【德善堂小儿推拿-瑜亮老师】大佬摊牌了:题目就考这一个知识点:stream=True,别的都是简单的很。这里给出了代码:

import requests
import time

url = ['https://wap.game.xiaomi.com/index.php?c=app&v=download&package=com.joypac.dragonhero.cn.mi&channel=meng_4001_2_android',
       'https://wap.game.xiaomi.com/index.php?c=app&v=download&package=com.yiwan.longtengtianxia.mi&channel=meng_4001_2_android',
       'https://wap.game.xiaomi.com/index.php?c=app&v=download&package=com.netease.mrzh.mi&channel=meng_4001_2_android']
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

start = time.time()
# 方法一:判断response.headers里面的内容
for i in url:
    resp = requests.get(i, headers=header, stream=True)
    if 'Content-Length' in resp.headers:
        print(f'有效url有:\n {i}')
end = time.time()
print(f'测试完毕!共耗时: {end - start:.2f}秒')

# 方法二:判断响应的字节流大小
start2 = time.time()
for i in url:
    resp = requests.get(i, headers=header, stream=True)
    chunk_size = 1024
    for data in resp.iter_content(chunk_size=chunk_size):
        if len(data) > 800:
            print(f'有效url有:\n {i}')
        break
end2 = time.time()
print(f'测试完毕!共耗时: {end2 - start2:.2f}秒')

下面是代码截图:

那小伙伴们就问了,那个stream参数是干啥用的啊?不慌,【月神】丢来一个解析。

如此就清晰多了。

三、总结

大家好,我是皮皮。这篇文章主要分享了在Python网络爬虫过程中,构建网络请求的时候,参数stream=True的使用,使用了一个具体的实例给大家演示了该参数的具体用法!关于该参数的介绍,请参考文中的解析。

最后感谢【德善堂小儿推拿-瑜亮老师】分享,感谢【皮皮】、【PI】、【月神】大佬给出的思路和代码支持,感谢粉丝【冫马讠成】、【孤独】等人参与学习交流。

selenium如何添加代理IP?

大家好,我是皮皮。

一、前言

前几天在Python钻石群有个叫【进击的python】的粉丝问了一个关于Python中selenium如何添加代理IP的问题,这里拿出来给大家分享下,一起学习。

二、解决过程

这里给出【PI】吴老板大佬的解答,一起来看看吧!

直接上图了,如下图所示:

他写这个已经是3年前的时候。

当年还是个实习生呢,现在是吴老板了。

三、总结

大家好,我是Python进阶者。这篇文章基于粉丝提问,针对selenium中怎样添加代理IP的问题,给出了具体说明和演示,顺利地帮助粉丝解决了问题!

最后感谢粉丝【进击的python】提问,感谢【PI】吴老板大佬给出的示例和代码支持。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

Jsrpc学习——加密参数Sign变化的网站破解教程

大家好,我是皮皮。前几天给大家分享jsrpc的介绍篇,Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介,还有实战篇,Jsrpc学习——网易云热评加密函数逆向,Jsrpc学习——Cookie变化的网站破解教程感兴趣的小伙伴可以戳此文前往。

今天给大家来个jsrpc实战教程,让大家加深对jsrpc的理解和认识。下面是具体操作过程,不懂的小伙伴可以私我。

今天我们介绍的这个网站是cookie参数不变,但是加密参数Sign变化的一个网站,一起来使用jsrpc来攻破它吧!

1、这里使用的网站是87aed0b6bc8cb687d63dd7eee0f64d38,MD5加密处理过的。

2、需要提取100个网页中的数字,然后求和。

3、打开浏览器抓包,然后打断点调试,依次点击右边的Call Stack内的东西,直到找到加密函数,里边的值对应请求参数即可判定。

4、最终在这里找到了一堆人看不懂的东西。

5、仔细寻找,发现加密的函数在这里了。

6、之后可以在控制台输入指令window.dcpeng = window.get_sign,其中window.get_sign为加密函数。注意:这个地方挺重要的,很多时候我们会写成ct.update(),这样会有问题!加了括号就是赋值结果,没加就是赋值整个函数!千差万别。

7、关闭网页debug模式。注意:这个地方挺重要的,很多时候如果不关闭,ws无法注入!

8、此时在本地双击编译好的文件win64-localhost.exe,启动服务。

9、之后在控制台注入ws,即将JsEnv.js文件中的内容全部复制粘贴到控制台即可(注意有时要放开断点)。

10、连接通信,在控制台输入命令var demo = new Hlclient(“ws://127.0.0.1:12080/ws?group=para&name=test”);

11、随后继续输入命令:

// 注册一个方法 第一个参数get_v为方法名,
// 第二个参数为函数,resolve里面的值是想要的值(发送到服务器的)
// param是可传参参数,可以忽略
demo.regAction("get_para", function (resolve) {
    dcpeng();
 var res = window.sign
    resolve(res);
})

也许有小伙伴会觉得奇怪,window.sign明明是在list这个变量中,为啥我们通过window.get_sign()可以获取到,莫非window.get_sign()和window.sign返回的值是一样的?其实window是整个全局,它只是声名一个list对象里面有signature等于全局的sign,这个全局的sign的值通过window.get_sing()得到。

dcpeng()就是一个函数,里面写的最后结果就是window.sign=window.get_sign(),并没有return东西。

12、之后就可以在浏览器中访问数据了,打开网址 http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={} ,这是调用的接口 group和name填写上面注入时候的,action是注册的方法名,param是可选的参数,这里续用上面的例子,网页就是:http://127.0.0.1:12080/go?group=para&name=test&action=get_para

13、如上图所示,我们看到了那个变化的参数v的值,直接通过requests库可以发起get请求。

14、现在我们就可以模拟数据,进行请求发送了。

15、将拷贝的内容可以丢到这里进行粘贴:http://tool.yuanrenxue.com/curl

16、之后将右侧的代码复制到Pycharm中即可用,非常便利。

17、之后就可以构造请求了,加一个整体循环,然后即可获取翻页的内容,整体代码如下所示。

import requests
import json

cookies = {
    'session': '6c78df1c-37aa-4574-bb50-99784ffb3697.Qcl0XN6livMeZ-7tbiNe-Ogn8L4',
    'v': 'A7s8gqX6XgjWtmKFwCNKPNdQSpQgEM9-ySWTzq14lzDRLtVKNeBfYtn0IxW-',
}

headers = {
    'Connection': 'keep-alive',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Origin': 'http://spider.wangluozhe.com',
    'Referer': 'http://spider.wangluozhe.com/challenge/2',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}
all_data = []
for page_num in range(1, 101):
    sign_url = 'http://127.0.0.1:12080/go?group=para&name=test&action=get_para'
    sign = requests.get(url=sign_url).json()["get_para"]
    # print(sign)
    data = {
      'page': f'{page_num}',
      'count': '10',
      '_signature': sign
    }
    print(f'Crawlering page {page_num}')

    response = requests.post('87aed0b6bc8cb687d63dd7eee0f64d38', headers=headers, cookies=cookies, data=data, verify=False).json()
    for item in response["data"]:
        all_data.append(item["value"])
        # print(item["value"])

print(sum(all_data))

运行结果如上图所示,和网页上呈现的数据一模一样。

18、至此,请求就已经完美的完成了,如果想获取全部网页,构造一个range循环翻页即可实现。

17、也欢迎大家挑战该题目,我已经挑战成功了,等你来战!

总结

大家好,我是皮皮。这篇文章主要给大家介绍了jsrpc的实战教程,使用jsrpc工具可以在网络爬虫过程中事半功倍,无需仔细的去扣环境,去一步步逆向,只一个黑盒的模式,我们就拿到了想要的结果,屡试不爽。

初次接触jsrpc的小伙伴可能看不懂,这里还有黑哥录制的一个视频,大家可以对照着视频进行学习,地址:https://www.bilibili.com/video/BV1EQ4y1z7GS,黑哥全程无声演示,视频的BGM很大,建议大家可以静音播放,领会其中奥义。

关于jsrpc工具,可以点击原文前往获取。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

拼刀刀店铺后台的参数anti-content逆向分析

大家好,我是黑脸怪。今天给大家分享pin嘻嘻逆向。

分析网址:’aHR0cHM6Ly9tbXMucGluZHVvZHVvLmNvbS9nb29kcy9nb29kc19saXN0′

1.介绍-为什么要逆向anti-content参数

用代码访问后台数据不带anti参数的话会提示“访问频繁”,所以需要逆向出这个参数!

2.开始逆向js

2.1 找参数所在位置-先在控制台全局搜索参数名字

搜索出来10个结果 不算多,每个都点进去 在差不多的关键词位置打上断点先。

因为它Ajax请求每个页面都要anti参数 所以我们下断点之后随便点个按钮都能用 已经断下来了,这个aa1d开头的js文件(你们的不一定叫这名),可以把其他断点取消了,现在来着重分析这个。

2.2 跟栈-找加密的方法

这里是一个异步代码调用,我们把断点打到它上一层这里先。

return Promise.resolve(u(t.rawFetch, d).catch((function() {}

直接f8放过去 再重新点一次 会到达上面那个断点

f11单步调试进来 会跟到这里

getCrawlerInfo: function(t) {
                return Promise.resolve(G((function() {
                    var e = I.a.getInstance(t);
                    return Promise.resolve(e.getServerTime()).then(F)
                }
                ), (function() {
                    return ""
                }
                )))
            }

对于异步不太懂的 我这里强行演示一波 (百度小抄一下改改)

//1. Promise.resolve("111")

 Promise.resolve("111")
//Promise {<fulfilled>: '111'}
//    [[Prototype]]: Promise
//    [[PromiseState]]: "fulfilled"  这是完成的状态 
//    [[PromiseResult]]: "111"       这是结果


//2.Promise.resolve("").then(函数())


Promise.resolve("我是参数?").then(function(a){console.log("111",a);return "123"})
//111 我是参数?
//Promise {<fulfilled>: '123'}
//    [[Prototype]]: Promise
//    [[PromiseState]]: "fulfilled"
//    [[PromiseResult]]: "123"

所以e是时间戳,f是主要函数 下断点到这 f8直接过来 再单步两次到F

要的是里面的这串代码 :new一个对象 对象传入一个包含serverTime的对象这里我也不太理解 最后messagePack肯定就是方法了。。。不管他直接复制在控制台跑一下出结果了。

new (n("eDaA"))({
    serverTime: t
}).messagePack()

2.3 代码分析

n(“eDaA”) 我第一眼看这不就是个webpack吗 当时觉得还是以前的玩法 找到n方法的加载器 再复制eDaA这个模块就可以跑了。没想到跟进去发现 eDaA里面又是一个加载器和模块 第一次见到这样的 没玩过,研究了半天

eDaA导出fbeZ fbeZ又导出里面的整个webpack

所以最后我们只要fbeZ里面的webpack 跳过第一层直接取它, 因为它是第二层的 加载器不适用,需要找个通用的加载器

下面的加载器可以输出”111″就行

window=global;
!(function (e) {
    var i = {}
        , o = {
        index: 0
    }

    function c(t) {
        if (i[t])
            return i[t].exports;
        var n = i[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        // console.log(t)
        return e[t].call(n.exports, n, n.exports, c),
            n.l = !0,
            n.exports
    }

    window.hliang1 = c
}
)([
    function(e,t,n){
        console.log("111")
    }
])
window.hliang1(0)

复制过来后 把前面列表的[和屁股后面的}]删除掉一个 因为会复制多

因为用notepad++代码格式化的问题,有一个模块会提示代码有问题

去网站重新粘贴一下这串代码到vscode(pycharm)

这样就完成了,用window.hliang1 就可以调用模块了

下面开始复制qe对象

它new 的qe对象就在模块里面啊,我不知道怎么直接new 所以新建了一个函数 然后对它改写

全部复制下来

function  hliang_qe(){

    //复制进这里来

}

(function (e, t) {}).call(this,a,b) 这种就是 把a,b传参到e,t

所以改写 匿名删除去掉,.call去掉,传参的e,t直接设置成

var e=window.hliang1(3) 还有其他地方n() 这里加载器名字改一下

t原本的作用是导出(t.exports)那我这里不要t了 直接导出改成return

如下图

复制到浏览器执行,成功出结果。但是这个代码在node.js还需要补环境和改环境。

3.环境检测

在浏览器能跑 在node.js跑不了 需要补环境。

这都啥报错啊,看不懂。 先上环境吧。


算了懒得写了。

直接告诉你们要补啥吧。

cookie和localStorage.Item传入自己的就行了 过期的也没事

window = global
document={
    addEventListener:function addEventListener(a,b){
        // console.log("addevent",a,b)
        return undefined
    },
    referrer:'',
    getElementById:function getElementById(a){
      console.log("getbyid",a)
      return "<head></head>"
    },
    cookie:''//这里传一个自己的cookie 过期了的也没事
}
var Plugins={0:{}}
navigator={
    webdriver:false,
    plugins: Plugins,
    languages:["zh-CN","zh"],
    hasOwnProperty:function hasOwnProperty(a){
      // console.log(a,"hasOwnProperty");
      if (a=="webdriver"){
        return false
      }

    },
    userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36"
}

screen={availWidth:1920,availHeight:1040}
history={
  back:function back(){console.log("back",arguments)}
}
location={
  href:"https://mms.pinduoduo.com/goods/goods_list",
  port:""
}
chrome={}

localStorage={
  getItem:function getItem(a){
      
    // console.log("item",arguments)
    if (a=="_nano_fp"){
      return "" //这里也传一个自己的
    }
  }
}

window["chrome"]=chrome
window["location"]=location
window["navigator"]=navigator
window["history"]=history
window["document"]=document
window["screen"]=screen
window["localStorage"]=localStorage


Object.defineProperty && Object.defineProperty(window, "outerHeight", {
    value: 1040,
    writable: false
});
Object.defineProperty && Object.defineProperty(window, "outerWidth", {
    value: 1920,
    writable: false
});

function DeviceOrientationEvent(){
   console.log("DeviceOrientationEvent",arguments)
}
window["DeviceOrientationEvent"]=DeviceOrientationEvent
function DeviceMotionEvent(){
  console.log("DeviceMotionEvent",arguments)
 }
 window["DeviceMotionEvent"]=DeviceMotionEvent
//delete window.Buffer //e("0x3c", "anZ%")
document.getElementById.toString=function(){
    return 'function getElementById() { [native code] }'
}

可以了。环境+上面的代码就能跑了

{"success":true,"errorCode":1000000,"errorMsg":null,"result":{"sessionId":"e70ae011c9c64f8fbf0e70fada362385","total":0,"goods_list":[]}}

演示地址:

http://z.hl98.cn/index.php?share/file&user=102&sid=CiAXx7ry

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

Jsrpc学习——网易云热评加密函数逆向

大家好,我是皮皮。

前几天给大家分享jsrpc的介绍篇,Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介,感兴趣的小伙伴可以戳此文前往。今天给大家来个jsrpc实战教程,Jsrpc学习——Cookie变化的网站破解教程,让大家继续加深对jsrpc的理解和认识。下面是具体操作过程,不懂的小伙伴可以私我。

1、因为网易云音乐热评的加密并不在cookie上,而是参数加密,所以这里就不需要进行hook住cookie了。

2、之前就知道网易云音乐热评的加密存在之地是在下图的位置,是那个函数window.asrsea(JSON.stringify(i1x), bsR1x([“流泪”, “强”]), bsR1x(Xp8h.md), bsR1x([“爱心”, “女孩”, “惊恐”, “大笑”]))

3、找到了aes加密地方的函数,就赋值一个自己名字的全局变量,然后转发加密就行了。之后可以在控制台输入指令window.dcpeng = window.asrsea,其中window.asrsea为加密函数。注意:这个地方挺重要的,很多时候我们会写成ct.update(),这样会有问题!加了括号就是赋值结果,没加就是赋值整个函数!千差万别。

4、关闭网页debug模式。注意:这个地方挺重要的,很多时候如果不关闭,ws无法注入!

5、此时在本地双击编译好的文件win64-localhost.exe,启动服务。

6、之后在控制台注入ws,即将JsEnv.js文件中的内容全部复制粘贴到控制台即可(注意有时要放开断点)。

7、连接通信,在控制台输入命令var demo = new Hlclient(“ws://127.0.0.1:12080/ws?group=para&name=wangyiyun”);

8、随后继续输入命令:

// 注册一个方法 第一个参数get_v为方法名,
// 第二个参数为函数,resolve里面的值是想要的值(发送到服务器的)
// param是可传参参数,可以忽略
demo.regAction("get_para", function (resolve, param) {
 console.log(param);
 console.log(JSON.stringify(param));
    var res = dcpeng(param, '010001', '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7', '0CoJUm6Qyw8W8jud');
    resolve(JSON.stringify(res));
})

这里就用到了参数param,param也就是需要传值过来的json对象,因为你不可能获取固定的歌曲id和页码,所以用python写成字典,通过url编码写在param里。

9、这里为何不写成dcpeng(JSON.stringify(param)…)这样呢?因为get传过来的就是字符串,不用json转字符串了。

上图20行的位置那是json转字符串,因为只能返回字符串,返回对象的话会变成显示”[object]”

这两步只是控制台打印,不用管。

10、之后就可以在浏览器中访问数据了,打开网址 http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={} ,这是调用的接口 group和name填写上面注入时候的,action是注册的方法名,param是可选的参数,这里续用上面的例子,网页就是:http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m=rid=R_SO_4_1909604321&threadId=R_SO_4_1909604321&pageNo=1&pageSize=20&cursor=-1&offset=0&orderType=1

11、如上图所示,我们看到了那个变化的参数v的值,直接通过requests库可以发起get请求。

12、现在我们就可以模拟数据,进行请求发送了,整体代码如下所示。

import requests
import json
import urllib.parse

songid = '1908392914'
data = {
    "rid": f"R_SO_4_{songid}",
    "threadId": f"R_SO_4_{songid}",
    "pageNo": "1",
    "pageSize": "20",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "csrf_token": ""
}
song_info = str(data)
param = (urllib.parse.quote(song_info))
param_url = f"http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m={param}"
response = requests.get(url=param_url).text
response_json = json.loads(response)
get_para = json.loads(response_json["get_para"])
encText = get_para["encText"]
encSecKey = get_para["encSecKey"]
# print(encText)
# print(encSecKey)


data = {
    'params': encText,
    'encSecKey': encSecKey
}

response = requests.post('https://music.163.com/weapi/comment/resource/comments/get?csrf_token=', data=data)
print(response.text)

运行之后,可以得到网页上的评论数据:

放到json中去解析,和网页上呈现的数据一模一样。

下面是原网页上的原始数据:

13、至此,请求就已经完美的完成了,如果想获取全部网页,构造一个range循环翻页即可实现,改变请求参数中的pageNo即可。

14、如果想抓取不同的歌曲,只需要替换songid这个参数即可。

总结

大家好,我是皮皮。这篇文章主要给大家介绍了jsrpc的实战教程,使用jsrpc工具可以在网络爬虫过程中事半功倍,无需仔细的去扣环境,去一步步逆向,只一个黑盒的模式,我们就拿到了想要的结果,屡试不爽。

初次接触jsrpc的小伙伴可能看不懂,这里还有黑哥录制的一个视频,大家可以对照着视频进行学习,地址:https://www.bilibili.com/video/BV1EQ4y1z7GS,黑哥全程无声演示,视频的BGM很大,建议大家可以静音播放,领会其中奥义。

关于jsrpc工具,可以点击原文前往获取。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

Jsrpc学习——Cookie变化的网站破解教程

大家好,我是皮皮。前几天给大家分享jsrpc的介绍篇,Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介,感兴趣的小伙伴可以戳此文前往。

今天给大家来个jsrpc实战教程,让大家加深对jsrpc的理解和认识。下面是具体操作过程,不懂的小伙伴可以私我。

1、对Cookie进行hook,需要在浏览器的控制台输入命令Object.defineProperty(document, “cookie”, {set:function(a){debugger}})

2、之后点击下一页,进入debug模式

3、依次点击右边的Call Stack内的东西,直到找到加密函数,里边的值对应请求参数即可判定。

4、之后可以在控制台输入指令window.dcpeng = ct.update,其中ct.update为加密函数。注意:这个地方挺重要的,很多时候我们会写成ct.update(),这样会有问题!加了括号就是赋值结果,没加就是赋值整个函数!千差万别。

5、关闭网页debug模式。注意:这个地方挺重要的,很多时候如果不关闭,ws无法注入!

6、此时在本地双击编译好的文件win64-localhost.exe,启动服务。

7、之后在控制台注入ws,即将JsEnv.js文件中的内容全部复制粘贴到控制台即可(注意有时要放开断点)。

8、连接通信,在控制台输入命令var demo = new Hlclient(“ws://127.0.0.1:12080/ws?group=v&name=test”);

9、随后继续输入命令:

// 注册一个方法 第一个参数get_v为方法名,
// 第二个参数为函数,resolve里面的值是想要的值(发送到服务器的)
// param是可传参参数,可以忽略
demo.regAction("get_v", function (resolve, param) {
    // var c = "好困啊" + param;
    var c = dcpeng();
    resolve(c);
})

10、之后就可以在浏览器中访问数据了,打开网址 http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={} ,这是调用的接口 group和name填写上面注入时候的,action是注册的方法名,param是可选的参数,这里续用上面的例子,网页就是:http://127.0.0.1:12080/go?group=v&name=test&action=get_v

11、如上图所示,我们看到了那个变化的参数v的值,直接通过requests库可以发起get请求。

12、现在我们就可以模拟数据,进行请求发送了。

13、将拷贝的内容可以丢到这里进行粘贴:http://tool.yuanrenxue.com/curl

14、之后将右侧的代码复制到Pycharm中即可用,非常便利。

15、之后就可以构造请求了,整体代码如下所示。

import requests

v_url = "http://127.0.0.1:12080/go?group=v&name=test&action=get_v"
v_res = requests.get(url=v_url).json()["get_v"]


cookies = {
    'session': '6c78df1c-37aa-4574-bb50-99784ffb3697.Qcl0XN6livMeZ-7tbiNe-Ogn8L4',
    'v': v_res,
}

headers = {
    'Connection': 'keep-alive',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With': 'XMLHttpRequest',
    'hexin-v': 'A3_4zkkuI7xygCZatjHGiHM8DlgKZNPp7bnX-hFMGsZ175EOGTRjVv2IZ04i',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Origin': 'http://spider.wangluozhe.com',
    'Referer': 'http://spider.wangluozhe.com/challenge/6',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}

data = {
  'page': '3',
  'count': '10'
}

response = requests.post('http://spider.wangluozhe.com/challenge/api/6', headers=headers, cookies=cookies, data=data, verify=False).json()

print(response)

运行结果如上图所示,和网页上呈现的数据一模一样。

16、至此,请求就已经完美的完成了,如果想获取全部网页,构造一个range循环翻页即可实现。

17、也欢迎大家挑战该题目,我已经挑战成功了,等你来战!

总结

大家好,我是皮皮。这篇文章主要给大家介绍了jsrpc的实战教程,使用jsrpc工具可以在网络爬虫过程中事半功倍,无需仔细的去扣环境,去一步步逆向,只一个黑盒的模式,我们就拿到了想要的结果,屡试不爽。

初次接触jsrpc的小伙伴可能看不懂,这里还有黑哥录制的一个视频,大家可以对照视频进行学习,地址:https://www.bilibili.com/video/BV1EQ4y1z7GS,黑哥全程无声演示,视频的BGM很大,建议大家可以静音播放,领会其中奥义。

关于jsrpc工具,可以点击原文前往获取。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介

大家好,我是黑脸怪。这篇文章主要给大家介绍jsrpc,方便大家日后在遇到JS逆向的时候派上用场。

前言

jsrpc是指在浏览器开启一个ws和go服务连接,以调用http接口的形式来通信,浏览器端收到调用通信执行原先设置好的js代码。可以用于js逆向调用加密函数直接返回结果,也可以用来直接获取数据。

该工具和代码,已经上传到git,下载即可用。

下载地址:https://github.com/jxhczhl/JsRpc#jsrpc-hliang

代码目录结构

-- main.go (服务器的主代码)
-- resouces/JsEnv.js (客户端注入js环境)

基本介绍

运行服务器程序和js脚本,即可让它们通信,实现调用接口执行js获取想要的值(加解密)

实现

原理:在网站的控制台新建一个WebScoket客户端链接到服务器通信,调用服务器的接口 服务器会发送信息给客户端 客户端接收到要执行的方法执行完js代码后把获得想要的内容发回给服务器 服务器接收到后再显示出来

说明:本方法可以https证书且支持wss

在https的网站想要新建WebSocket连接如果是连接到普通的ws可能会报安全错误,好像连接本地(127.0.0.1)不会报错~ 可以用本地和wss 你自己看着玩。

无https证书者。直接编译main.go,我试了一下,发现使用本地ip(127.0.0.1)可以在https的网站直接连接ws使用 默认端口12080。

有https证书者。修改main.go文件 把r.Run()注释掉,把r.RunTls注释取消掉 并且参数设置证书的路径 直接输入名字就是当前路径 默认端口:12443。

另外的题外话,有域名没证书不会搞的 或者有域名有公网(非固定IP的)都可以搞成的,自己研究研究。

使用方法

首先下载编译好的文件,下载地址:https://github.com/jxhczhl/JsRpc/releases/tag/Windows

直接双击打开编译好的文件,开启服务。

api 简介

  • /list :查看当前连接的ws服务
  • /ws :浏览器注入ws连接的接口
  • /result :获取数据的接口 (数据格式json: {“group”:”hhh”,”hello”:”好困啊yes”,”name”:”baidu”,”status”:”200″} )

说明:接口用?group和name来区分 如注入ws的例子 ws://127.0.0.1:12080/ws?group={}&name={}, group和name都可以随便,这是调用的接口:http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={},group和name填写上面注入时候的,action是注册的方法名,param是可选的参数。

注入JS,构建通信环境

打开JsEnv 复制粘贴到网站控制台(注意有时要放开断点)。

注入ws与方法

// 连接通信
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=hhh&name=baidu");
// 注册一个方法 第一个参数hello为方法名,
// 第二个参数为函数,resolve里面的值是想要的值(发送到服务器的)
// param是可传参参数,可以忽略
demo.regAction("hello", function (resolve, param) {
    var c = "好困啊" + param;
    resolve(c);
})

访问接口,获得数据

http://127.0.0.1:12080/go?group=hhh&name=baidu&action=hello¶m=yes
// 其中 hello是会变的 是action名字。 用代码访问的时候要注意这个名字
{
  "group":"hhh",
  "hello":"好困啊yes",
  "name":"baidu",
  "status":"200"
}

总结

大家好,我是黑脸怪。 这篇文章主要给大家介绍jsrpc,文章的理论性很强,看上去十分的粗犷,不过别担心,接下来我给大家出几篇关于使用jsrpc来进行逆向的文章,针对实际的网站应用此工具,让大家加深对该工具的理解和认识。点击阅读原文,即可可以前往项目git地址。

jsrpc是指在浏览器开启一个ws和go服务连接,以调用http接口的形式来通信,浏览器端收到调用通信执行原先设置好的js代码。可以用于js逆向调用加密函数直接返回结果,也可以用来直接获取数据。日后用在爬虫中,可以事半功倍。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

一篇文章教会你用Python爬取淘宝评论数据

【一、项目简介】

    本文主要目标是采集淘宝的评价,找出客户所需要的功能。统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等。

【二、项目准备工作】

1. 准备Pycharm,下载安装等,可以参考这篇文章:Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

2. 爬取商品地址,如下所示:

https://detail.tmall.com/item.htm?spm=a230r.1.14.1.55a84b1721XG00&id=552918017887&ns=1&abbucket=17

3. 需要下载几个库,如何下载呢?

打开pycharm软件点击File在点击setting选项,再选择Project:你的文件名下边的Project:Interpreter选项。

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

点击+号,安装这个项目需要用的库,例如:requests、beautifulsoup4、simplejson。

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据
【三、项目实现】

1. 导入需要的库

import requests
from bs4 import  BeautifulSoup as bs
import json
import csv
import re

2. 需要登录淘宝网,选择谷歌浏览器选择开发者工具或按F12有个Network选项,查找list_detail_rate.htm?文件

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

定义一个变量存储URL地址PAGE_URL = []

定义一个生成链接列表函数,使用字符串拼接形成评论的页数

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

定义一个获取评论数据函数内定义需要用到的字段例如:用户名、评论时间、颜色分类、评论,如下图所示。

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据
python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

那个cookie值在在开发者工具Network有个item.htm?spm文件有个cookie复制过来就好了。

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

解析JS文件内容、将数据写入TEXT文件中,如下图所示。

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据
python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

最后定义一个主函数爬取需要的评论页数,如下图所示。

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

最后得到的结果如图所示:

python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据

 

【四、总结】

1、本文基于Python网络爬虫,采集了淘宝商品的评价,方法行之有效。但是建议不要抓取太多,以免对服务器造成压力。

2、如果需要本文源码,请在公众号后台回复“淘宝评论”获取。

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

——————- End ——————-

往期精彩文章推荐:

关于Scrapy爬虫项目运行和调试的小技巧(下篇)

前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下。今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧。

三、设置网站robots.txt规则为False

一般的,我们在运用Scrapy框架抓取数据之前,需要提前到settings.py文件中,将“ROBOTSTXT_OBEY = True”改为ROBOTSTXT_OBEY = False。

在未改动之后settings.py文件中默认爬虫是遵守网站的robots.txt规则的,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(下篇)

如果遵守robots.txt规则的话,那么爬取的结果会自动过滤掉很多我们想要的目标信息,因此有必要将该参数设置为False,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(下篇)

设置好robots.txt规则之后,我们便可以抓到更多网页的信息。

四、利用Scrapy shell进行调试

通常我们要运行Scrapy爬虫程序的时候会在命令行中输入“scrapy crawl crawler_name”,细心的小伙伴应该知道上篇文章中创建的main.py文件也是可以提高调试效率的,不过这两种方法都是需要从头到尾运行Scrapy爬虫项目,每次都需要请求一次URL,效率十分低。运行过Scrapy爬虫项目的小伙伴都知道Scrapy运行的时候相对较慢,有时候因为网速不稳定,根部就无法动弹。针对每次都需要运行Scrapy爬虫的问题,这里介绍Scrapy shell调试方法给大家,可以事半功倍噢。

Scrapy给我们提供了一种shell模式,让我们可以在shell脚本之下获取整个URL对应的网页源码。在命令行中进行运行,其语法命令是“scrapy shell URL”,URL是指你需要抓取的网页网址或者链接,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(下篇)

该命令代表的意思是对该URL进行调试,当命令执行之后,我们就已经获取到了该URL所对应的网页内容,之后我们就可以在该shell下进行调试,再也不用每次都执行Scrapy爬虫程序,发起URL请求了。

通过shell脚本这种方式可以极大的提高调试的效率,具体的调试方法同爬虫主体文件中的表达式语法一致。举个栗子,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(下篇)

将两个Xpath表达式所对应的选择器放到scrapy shell调试的脚本下,我们可以很清楚的看到提取的目标信息,而且省去了每次运行Scrapy爬虫程序的重复步骤,提高了开发效率。这种方式在Scrapy爬虫过程中十分常用,而且也十分的实用,希望小伙伴们都可以掌握,并且积极主动的为自己所用。

关于Scrapy爬虫项目运行和调试的部分小技巧先分享到这里,尤其是Debug调试和Scrapy shell调试极为常用,希望小伙伴们可以多多利用起来,让其为自己的项目服务,可以事半功倍噢~~

——————— End ———————

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

扫除运行Scrapy爬虫程序的bug之后,现在便可以开始进行编写爬虫逻辑了。在正式开始爬虫编写之前,在这里介绍四种小技巧,可以方便我们操纵和调试爬虫。

一、建立main.py文件,直接在Pycharm下进行调试

很多时候我们在使用Scrapy爬虫框架的时候,如果想运行Scrapy爬虫项目的话,一般都会想着去命令行中直接执行命令“scrapy crawl crawler_name”,其中crawler_name指的是爬虫的名字,在一开始创建Scrapy爬虫模板的时候就指定了的,而且在该爬虫项目中具有唯一性。但是每次跑到命令行下去执行,看交互的结果,有时候并不是很清晰,所以这里介绍一种方法,可以帮助大家提高开发效率,尤其是调试的时候更是显得方便。

在与爬虫项目的scrapy.cfg文件同级目录下建立一个main.py文件,用于控制整个爬虫项目的执行。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

在该文件夹中写入的代码见下图。其中execute函数是内嵌在scrapy中的,调用这个函数可以直接调用该Scrapy工程项目的爬虫脚本,这个函数的执行需要在爬虫项目的父目录下进行。而第7行代码的意思就是获取当前py文件的父目录,省去我们直接复制路径的精力和时间,同时也方便我们将该项目放到其他的平台上去运行,不会报路径的错误。execute函数里边的参数其实就是将Scrapy爬虫执行命令拆分,然后分别以一个字符的方式放到了一个数组中。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

之后我们直接运行这个main.py文件便可以调用Scrapy爬虫程序了。

二、多用Debug进行调试,提高开发速度

相信用过Pycharm的小伙伴都看到过Debug这个东东,它的英文意思就是“小虫子”,在Pycharm中的logo也是个小虫子,像是七星瓢虫一样,不过很多小伙伴可能还没有怎么用过,这里简单的介绍给大家,希望大家日后可以多多用到,对于项目的调试十分有帮助。

在进行Debug调试之前,我们需要在我们想要调试的代码左侧进行打断点,断点一般是红色的,打断点的方式很简单,只需要在代码的左侧点击一下左键即可,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

断点设置完成之后,便可以去main.py文件进行调试了。在main.py文件点击右键,然后选择“Debug ‘main’”,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

之后爬虫程序便开始进行调试,并且会返回一系列结果,如下图所示,可以方便的进行拖拽查看。同时也会在爬虫文件中以绿色的字体进行显示爬虫的结果,很漂亮。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

如果想退出或者停止该调试,则点击Pycharm上方选项卡的Run,然后点击“Stop ‘main’”即可,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

之后该爬虫程序就会退出调试,恢复正常的Pycharm界面,如下图所示。

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

关于Scrapy爬虫项目运行和调试两个小技巧先分享到这里,下次将分享Scrapy爬虫项目中更为实用的两种调试方法,敬请期待~~

——————— End ———————

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他