python解决网站的反爬虫策略总结


Posted in Python onOctober 26, 2016

本文详细介绍了网站的反爬虫策略,在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。这里我们只讨论数据采集部分。

一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种一些应用ajax的网站会采用,这样增大了爬取的难度(防止静态爬虫使用ajax技术动态加载页面)。

1、从用户请求的Headers反爬虫是最常见的反爬虫策略。

伪装header。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名[评论:往往容易被忽略,通过对请求的抓包分析,确定referer,在程序中模拟访问请求头中添加]。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

2、基于用户行为反爬虫

还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。[这种防爬,需要有足够多的ip来应对]

(1)、大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib中很容易做到,这样就能很容易的绕过第一种反爬虫。

编写爬虫代理:

步骤:

1.参数是一个字典{'类型':'代理ip:端口号'}

proxy_support=urllib.request.ProxyHandler({})
2.定制、创建一个opener

opener=urllib.request.build_opener(proxy_support)
3a.安装opener

urllib.request.install_opener(opener)
3b.调用opener

opener.open(url)

用大量代理随机请求目标网站,应对反爬虫

#! /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])

(2)、对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。[评论:对于账户做防爬限制,一般难以应对,随机几秒请求也往往可能被封,如果能有多个账户,切换使用,效果更佳]

3、动态页面的反爬虫

上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过Java生成的。

解决方案:Selenium+PhantomJS                           

Selenium:自动化web测试解决方案,完全模拟真实的浏览器环境,完全模拟基本上所有的用户操作

PhantomJS :一个没有图形界面的浏览器

 获取淘宝妹妹的个人详情地址:

#! /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获取目录下所有文件的方法
Jun 01 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
python基础教程之五种数据类型详解
Jan 12 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
在Python 中同一个类两个函数间变量的调用方法
Jan 31 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
python 循环数据赋值实例
Dec 02 Python
python实现智能语音天气预报
Dec 02 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 Python
Python控制多进程与多线程并发数总结
Oct 26 #Python
Python网络爬虫项目:内容提取器的定义
Oct 25 #Python
Python实现ssh批量登录并执行命令
Oct 25 #Python
详解Python的Lambda函数与排序
Oct 25 #Python
Python脚本实现Web漏洞扫描工具
Oct 25 #Python
python+django快速实现文件上传
Oct 24 #Python
python实现简单爬虫功能的示例
Oct 24 #Python
You might like
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
php多重接口的实现方法
2015/06/20 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python黑魔法之参数传递
2016/02/12 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
计算机专业求职信
2014/06/02 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
2015年项目工作总结
2015/04/29 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
java解析XML详解
2021/07/09 Java/Android