一.爬虫高级--破解网站通过js加密生成cookie(一)

做爬虫很长时间了,遇见过千奇百怪的网站.本次记录一次简单破解js加密的网站.
目标网站:中国土地市场网
采集信息:如图在这里插入图片描述
需要采集的内容就是行政区代码,标题,标题的url,和发布时间.
好了,感觉应该不难.
那我们先尝试一下吧:

# -*- coding: utf-8 -*-
import requests

url = "http://www.landchina.com/default.aspx?tabid=226"
response = requests.get(url)
print response.status_code
print response.text

运行一下

200
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, post-check=0, pre-check=0"/><meta http-equiv="Connection" content="Close"/><script type="text/javascript">function stringToHex(str){var val="";for(var i = 0; i < str.length; i++){if(val == "")val = str.charCodeAt(i).toString(16);else val += str.charCodeAt(i).toString(16);}return val;}function YunSuoAutoJump(){ var width =screen.width; var height=screen.height; var screendate = width + "," + height;var curlocation = window.location.href;if(-1 == curlocation.indexOf("security_verify_")){ document.cookie="srcurl=" + stringToHex(window.location.href) + ";path=/;";}self.location = "/default.aspx?tabid=226&security_verify_data=" + stringToHex(screendate);}</script><script>setTimeout("YunSuoAutoJump()", 50);</script></head><!--2019-03-15 10:15:09--></html>

响应状态是200,但是响应内容…,这是什么鬼.怎么只给返回了一段js代码.
但是呢,看到js 代码里有关键词document.cookie,瞬间明白了.
重点来了
其实这就是网页的一种防爬手段,网页对我们的请求做了一次处理.我们第一次请求,网站通过这段js生成了一串cookie值,只有访问的时候携带着这个cookie,网站才会给我们正确的响应内容.

好了,既然这样,我们就尝试一下吧.
看一下js代码,如果懂一些前端的知识,这段js代码其实也不难.他仅仅是通过用我们的电脑屏幕的宽和高以及当前网页的地址,生成了cookie给我们的浏览器.
我们可以把他翻译成python.

def stringToHex(s):
    val = ""
    for k in s:
        if (val == ""):
            val = str(hex(ord(k)))
        else:
            val += str(hex(ord(k)))
    return val.replace("0x", "")

def get_cookie(url):
    screendate = "1366,768" #  屏幕宽度和高度我们可以设置成固定值.
    curlocation = url  # 当前请求的url
    cookie = "srcurl=" + stringToHex(curlocation) + ";path=/;"
    cookie = {"srcurl": cookie}
    url = url + "&security_verify_data=" + stringToHex(screendate)
    return url, cookie

在这里我们使用resuests.session模块.

在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会 话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。
会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。

到此基本上就完成了,代码没多少.因为这个网站需要保持会话才能获得正确的内容.还需要注意以下:

  1. 获得cookie前需要利用session访问一次目标网站.
  2. 获得cookie后也需要携带cookie访问一次js返回的验证的url

这也是使用session模块的原因,如果直接使用requests的话应该还需要获得响应的set-cookie写入的cookie.有兴趣的同学可以试试.
本次代码

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

import requests

def stringToHex(s):
    val = ""
    for k in s:
        if (val == ""):
            val = str(hex(ord(k)))
        else:
            val += str(hex(ord(k)))
    return val.replace("0x", "")

def get_cookie(url):
    screendate = "1366,768" #  屏幕宽度和高度我们可以设置成固定值.
    curlocation = url  # 当前请求的url
    cookie = "srcurl=" + stringToHex(curlocation) + ";path=/;"
    cookie = {"srcurl": cookie}
    url = url + "&security_verify_data=" + stringToHex(screendate)
    return url, cookie
if __name__ == "__main__":
    
    url = "http://www.landchina.com/default.aspx?tabid=226"
    session = requests.session()
    session.get(url)
    verify_url, cookie = get_cookie(url)
    session.get(verify_url)
    header = {
        "Host": "www.landchina.com",
        "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0",
        "Accept": "text/css,*/*;q=0.1",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Accept-Encoding": "gzip, deflate",
        "Referer": url,
        "Connection": "keep-alive"
    }
    response = session.get(url, headers=header, cookies=cookie)
    print response.text
    

猜你喜欢

转载自blog.csdn.net/weixin_35762183/article/details/88569379