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时间模块中的datetime模块
Jan 13 Python
python微信公众号开发简单流程
Mar 23 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Django CBV模型源码运行流程详解
Aug 17 Python
Python如何识别银行卡卡号?
Jun 10 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函数
2006/12/06 PHP
php auth_http类库进行身份效验
2009/03/19 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php获取淘宝分类id示例
2014/01/16 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python实现点云投影到平面显示
2020/01/18 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
高校优秀辅导员事迹材料
2014/05/07 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
校本课程教学计划
2015/01/19 职场文书
外贸英文求职信范文
2015/03/19 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
用Python selenium实现淘宝抢单机器人
2021/06/18 Python