您的位置:首页 > 运维架构 > 网站架构

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

2019-03-15 11:16 417 查看

做爬虫很长时间了,遇见过千奇百怪的网站.本次记录一次简单破解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, cookieif __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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: