python做反被爬保护的方法


Posted in Python onJuly 01, 2019

网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护。于是,很多网站开始反网络爬虫,想方设法保护自己的内容。

一: User-Agent +Referer检测

User-Agent 是HTTP协议的中的一个字段, 其作用是描述发出HTTP请求的终端的一些信息。

使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

服务器通过这个字段就可以知道访问网站的是什么人。对于不是正常浏览器的用户进行屏蔽。

解决方案:

伪装浏览器的User-Agent,因为每个浏览器的User-Agent不一样,并且所有的用户都能使用浏览器。所有每次请求的时候条件浏览器的User-Agent,就能解决UA检测

Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的。例如有一些图片网站在你请求图片的时候,就会检测你的Referer值,如果Referer不符合,不会返回正常的图片。

解决方案:

在检测referer的请求中,携带符合的referer值。

二: js混淆和渲染

所谓 JavaScript 混淆,基本就是:

1.去掉一些实际没有调用的函数。

2.将零散的变量声明合并。

3.逻辑函数的精简。

4.变量名的简化。具体要看不同的压缩工具的考虑优劣。常见的有UglifyJS、JScrambler等工具。

js渲染其实就是对HTML页面的修改。比如有一些网页本身没有返回数据,数据是经过js加载之后添加到HTML当中的。当遇到这种情况的时候,我们要知道爬虫是不会执行JavaScript操作。所以需要用其他的方法处理。

解决方案:

1.通过阅读网站js源码,找到关键的代码,并用python实现。

2.通过阅读网站js源码,找到关键的代码,用PyV8,execjs等库直接执行js代码。

3.通过selenium库直接模拟浏览器环境

三:IP限制频次

WEB系统都是走http协议跟WEB容器连通的,每次请求至少会产生一次客户端与服务器的tcp连接。

对于服务端来说可以很清楚的查看到,一个ip地址在单位时间内发起的请求。

当请求数超过一定的值之后,就可判断为非正常的用户请求。

解决方案:

1.自行设计ip代理池,通过轮换的方式,每次请求携带不同的代理地址。

2.ADSL动态拨号他有个独有的特点,每拨一次号,就获取一个新的IP。也就是它的IP是不固定的。

四:验证码

验证码(CAPTCHA)是“Completely Automated PublicTuring test to tell Computers and HumansApart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。

这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

解决方案:

1.手动识别验证码

2.pytesseract识别简单的验证码

3.对接打码平台

4.机器学习

扩展知识:

基于反爬的相关实例代码:

#! /usr/bin/env python3.4
#-*- coding:utf-8 -*-
#__author__ == "tyomcat"
 
 
import urllib.request
import random
import re
 
url='http://www.whatismyip.com.tw'
iplist=['121.193.143.249:80','112.126.65.193:80','122.96.59.104:82','115.29.98.139:9999','117.131.216.214:80','116.226.243.166:8118','101.81.22.21:8118','122.96.59.107:843']
 
proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[('User-Agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36')]
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
 
pattern = re.compile('<h1>(.*?)</h1>.*?<h2>(.*?)</h2>')
iterms=re.findall(pattern,html)
for item in iterms:
  print(item[0]+":"+item[1])
#! /usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ == "tyomcat"
 
from selenium import webdriver
import time
import re
 
drive = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')
drive.get('https://mm.taobao.com/self/model_info.htm?user_id=189942305&is_coment=false')
 
time.sleep(5)
 
pattern = re.compile(r'<div.*?mm-p-domain-info">.*?class="mm-p-info-cell clearfix">.*?<li>.*?<label>(.*?)</label><span>(.*?)</span>',re.S)
html=drive.page_source.encode('utf-8','ignore')
items=re.findall(pattern,html)
for item in items:
  print item[0],'http:'+item[1]
drive.close()
Python 相关文章推荐
Python兔子毒药问题实例分析
Mar 05 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
python opencv 直方图反向投影的方法
Feb 24 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
python对html过滤处理的方法
Oct 21 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 Python
python sqlite的Row对象操作示例
Sep 11 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
django rest framework 自定义返回方式
Jul 12 Python
python中spy++的使用超详细教程
Jan 29 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
python全栈知识点总结
Jul 01 #Python
python实现可变变量名方法详解
Jul 01 #Python
12个步骤教你理解Python装饰器
Jul 01 #Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 #Python
在python里面运用多继承方法详解
Jul 01 #Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 #Python
用python打印1~20的整数实例讲解
Jul 01 #Python
You might like
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
升职自荐书范文
2013/11/28 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
2019公司管理制度
2019/04/19 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
JS实现数组去重的11种方法总结
2022/04/04 Javascript
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
tomcat下部署jenkins的方法
2022/05/06 Servers