编程语言
首页 > 编程语言> > python爬虫 处理521状态码

python爬虫 处理521状态码

作者:互联网

  在抓取数据的时候往往可以通过状态码来判断返回结果,今天在抓取数据的时候碰到了以前没有碰到过得状态码521,输出它的爬取内容(text),发现是一些js代码。一起探讨一下如何处理521状态码。

  用charles抓包的时候,发现浏览器对于同一网页连续访问了两次,第一次的访问状态码为521,第二次为200(正常访问)。看来网页加了反爬虫机制,需要两次访问才可返回正常网页。

通过对比两次请求,我们发现第二次访问带了新的cookie值。再考虑上面程序对爬取结果的输出为js代码,可以考虑其操作过程为:第一次访问时服务器返回一段可动态生成cookie值的js代码;浏览器运行js代码生成cookie值,并带cookie重新进行访问;服务器被正常访问,返回页面信息,浏览器渲染加载。   弄清楚浏览器的执行过程后,我们就可以模拟其行为通过python作网页爬取。操作步骤如下:
  1. 用request.get(url)获取js代码

  2. 执行函数eval()语句修改为return语句返回cookie值

  3. 调用execjs执行js代码获得cookie值

  4. 将cookie值转化为字典格式,用request.get(url, headers=headers)方法获取得到正确的网页信息

代码如下:

def getResponse():
"""
获取response
:return:
"""
response = requests.get(startUrl, headers=headers)
return response


def getJslid(response):
"""

:param response:
:return:
"""
cook = response.cookies
return '; '.join(['='.join(item) for item in cook.items()])


def getClearance(response):
"""

:return:
"""
txt = ''.join(re.findall('<script>(.*?)</script>', response.text))
func_return = txt.replace('eval', 'return')
print(func_return)
content = execjs.compile(func_return)
eval_func = content.call('x')

name = re.findall(r'var (.*?)=function.*', eval_func)[0]

mode_func = eval_func.replace('while(window._phantom||window.__phantomas){};', ''). \
replace('document.cookie=', 'return').replace('if((function(){try{return !!window.addEventListener;}', ''). \
replace("catch(e){return false;}})()){document.addEventListener('DOMContentLoaded',%s,false)}" % name, ''). \
replace("else{document.attachEvent('onreadystatechange',%s)}" % name, '').replace(
r"setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')',1500);",
'')

content = execjs.compile(mode_func)
cookies = content.call(name)
# print(cookies)
clearance = cookies.split(';')[0]

return clearance


def structureHeaders(cook, clearance):
"""
构造新的headers
:return:
"""

cookie = {
'cookie': cook + ';' + clearance
}
return dict(headers, **cookie)

 

 




标签:return,python,爬虫,replace,headers,cookie,521,func,response
来源: https://www.cnblogs.com/gongs/p/10524710.html