003笔记-反爬虫之debugger调试

仅供学习研究***********************************仅供学习研究

一,描述

  对某些网站进行爬取分析或者算法分析,打开F12会自动断点,导致不能正常分析。如图:
在这里插入图片描述

二,项目分析:

(1).目标url: http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact
注意:此网站反爬措施已经更改,没有之前那么麻烦,这里还是以之前思路来分析。

(2).爬取‘我要咨询’里面的数据。如图:
在这里插入图片描述
(3).分析:
   1.打开F12调试,点击"我要咨询"发现再次点击其他的无效。如图:
在这里插入图片描述
接着再次点击这个按钮(直到取消为止),如图:
在这里插入图片描述
  2.点击Network,选择interact,查看Headers里面的内容,这里留意一下请求头里面的Cookies;如图:
在这里插入图片描述
  3.接着看看XHR里面,发现有个getList,单击查看详细内容:
在这里插入图片描述
不妨多点击几次下一页看看,发现start在变化;对着每页数据来看一页7个数据,这里就是数据存放的地方了。
在这里插入图片描述
  4.此时的请求URL是:[http://zwfw.san-he.gov.cn/icity/api-v2/app.icity.guestbook.WriteCmd/getLists=a747491606926198736&t=9969_a27070_1606926426000],请求方法是:POST;需要留意’s’和’t’两个参数的值,发现:
在这里插入图片描述
  5.试着猜想’s’和’t’参数值会不会从js文件得出来的,接着找js文件,再次点击’我要咨询’,点击图中红色框选部分:
在这里插入图片描述
直到sources里面出现一个js文件:
在这里插入图片描述
将它格式化:
在这里插入图片描述
格式化后,Ctrl+F搜索"var s",大概在第21个,发现:
在这里插入图片描述
  6.解析js代码:

if (this.isApiV2) {
            var sig = "";
            var chars = "0123456789abcdef";
            // 1,__signature
            if (!LEx.isNotNull(__signature)) {
            	// 随机数+时间戳
                var curTime = parseInt(Math.random() * (9999 - 1000 + 1) + 1000) + "" + Date.parse(new Date());
                // var __signature 自动生成的
                sig = chars.charAt(parseInt(Math.random() * (15 - 15 + 1) + 10)) + chars.charAt(curTime.length) + "" + curTime;
            } else {
                sig = __signature;
            } 
            // key 形成例如这种字符串:b99999 e01866 c70212
            var key = "";
            var keyIndex = -1;
            for (var i = 0; i < 6; i++) {
            	// charAt(0)指定位置字符
                var c = sig.charAt(keyIndex + 1);
                key += c;
                // indexOf:索引
                keyIndex = chars.indexOf(c);
                if (keyIndex < 0 || keyIndex >= sig.length) {
                    keyIndex = i;
                }
            }
			// 4位0-9随机数+'_' + key + '_' + 时间戳
            var timestamp = parseInt(Math.random() * (9999 - 1000 + 1) + 1000) + "_" + key + "_" + Date.parse(new Date());
            var t = timestamp;
            //LEx.azdg.encrypt(timestamp,key);
            t = t.replace(/\+/g, "_");
            curUrl += "?s=" + sig;
            curUrl += "&t=" + t;
        }

  (1).__signature:自动生成的:
在这里插入图片描述

三,抓取数据

import requests
import time
import random
import re
from fake_useragent import UserAgent

# 目标url
target_url = 'http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact#'
respon = requests.get(target_url)
# 获取cookie
ck = respon.cookies['ICITYSession']
headers = {
    'User-Agent': UserAgent().random,
    'Cookies': str(ck)
}
# 返回页数数据
html = respon.text
# print(html)
# 使用re模块获取__signature
signa = re.findall(r'var __.* = "(.*)"', html)
sig = signa[1]
# print(sig)

如图:

在这里插入图片描述
将上述代码封装一下:

def target_url():
    target_url = 'http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact#'
    respon = requests.get(target_url)
    # 获取cookie
    ck = respon.cookies['ICITYSession']
    headers = {
        'User-Agent': UserAgent().random,
        'Cookies': str(ck)
    }

    html = respon.text
    # print(html)
    signa = re.findall(r'var __.* = "(.*)"', html)
    sig = signa[1]
    # print(sig)
    return sig, headers

接着来解决debugger:

def target_url():
    target_url = 'http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact#'
    respon = requests.get(target_url)
    # 获取cookie
    ck = respon.cookies['ICITYSession']
    headers = {
        'User-Agent': UserAgent().random,
        'Cookies': str(ck)
    }

    html = respon.text
    # print(html)
    signa = re.findall(r'var __.* = "(.*)"', html)
    sig = signa[1]
    # print(sig)
    return sig, headers
    

# 无限debug
def get_url():
    sig, headers = target_url()
    key = ''
    key_index = -1
    chars = '0123456789abcdef'
    for i in range(0, 6):
        c = sig[key_index+1]
        key += c
        key_index = chars.index(c)
        if key_index < 0 or key_index >= len(sig):
            key_index = i
    print(key)
    # 4位随机数_key_时间戳str(int(time.time())*1000)-->1606927383000
    t = str(int(random.randint(999, 10000))) + '_' + key + '_' + str(int(time.time())*1000)
    # t.replace('+', '_')
    # print(t)c
    # s: a747491606926198736
	# t: 8890_a27070_1606927383000
    for i in range(0, 77, 7):
    	# 获取类容的起始url
        start_url = 'http://zwfw.san-he.gov.cn/icity/api-v2/app.icity.guestbook.WriteCmd/getList?s={}&t={}'.format(sig, t)
		# 爬取多页
        params = {
            'start': str(i),
            'limit': '7',
            'TYPE @=': "2",
            'OPEN @=': "1",
        }
        # {start: 0, limit: 7, TYPE@=: "2", OPEN@=: "1"}
        # {start: 7, limit: 7, TYPE@=: "2", OPEN@=: "1"}
        # {start: 14, limit: 7, TYPE@=: "2", OPEN@=: "1"}
        resp = requests.post(start_url, headers=headers, params=params)
        print(resp.text)
        
if __name__ == '__main__':
    target_url()
    get_url()        

如图(部分):
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页