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实现bitmap数据结构详解
Feb 17 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
Python实现ping指定IP的示例
Jun 04 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
Flask框架模板继承实现方法分析
Jul 31 Python
python正则表达式匹配IP代码实例
Dec 28 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
Mar 24 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
Apr 22 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 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
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
详解PHP中的Traits
2015/07/29 PHP
详解PHP PDO简单教程
2019/05/28 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
物流专业大学的自我评价
2014/01/11 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
大学四年个人自我小结
2014/03/05 职场文书
大学社团活动总结
2014/04/26 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
Pytest中skip skipif跳过用例详解
2021/06/30 Python