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中使用中文的方法
Feb 19 Python
Python中subprocess模块用法实例详解
May 20 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
谈谈python中GUI的选择
Mar 01 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
python主要用于哪些方向
Jul 05 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
python3.5的包存放的具体路径
2020/08/16 Python
python GUI计算器的实现
2020/10/09 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
介绍一下OSI七层模型
2012/07/03 面试题
优秀教师的感人事迹
2014/02/04 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
见义勇为事迹材料
2014/12/24 职场文书
新课程改革心得体会
2016/01/22 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
keepalived + nginx 实现高可用方案
2022/12/24 Servers