Python爬虫防封杀方法集合

Python 2.7
IDE Pycharm 5.0.3


前言

在爬取的过程中难免发生ip被封和403错误等等,这都是网站检测出你是爬虫而进行反爬措施,这里自己总结下如何避免

方法1:设置等待时间

有一些网站的防范措施可能会因为你快速提交表单而把你当做机器人爬虫,比如说以非常人的速度下载图片,登录网站,爬取信息。

常见的设置等待时间有两种,一种是显性等待时间(强制停几秒),一种是隐性等待时间(看具体情况,比如根据元素加载完成需要时间而等待)

1.显性等待时间

import time#导入包
time.sleep(3)#设置时间间隔为3秒

而且尽量在夜深人静的时候进行数据的采集,切记采集不要太快,不然容易让网站识别出你个非人类

2.隐式等待
这里用到的主要语句,以wait.until()为例
比如说形式如下

wait1.until(lambda driver: driver.find_element_by_xpath("//div[@id='link-report']/span"))

上面的语句就是在等待页面元素加载全部完成后才进行下一步操作,因为爬虫速度太快,导致一些元素没有被加载完全就进行下一步操作而导致没有查找到元素或者被网站认为是机器人在进行浏览。

具体的案例可以在我以前的文章中详细应用Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)


方法2:修改请求头

识别你是机器人还是人类浏览器浏览的重要依据就是User-Agent,比如人类用浏览器浏览就会使这个样子的User-Agent:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'

这里拿urllib2来说,默认的User-Agent是Python-urllib2/2.7,所以要进行修改。

import urllib2

req = urllib2.Request(url)
#多了以下一这一步而已
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')

response = urllib2.urlopen(req)


方法3:采用代理ip

当自己的ip被网站封了之后,只能采取换代理ip的方式进行爬取,所以,我建议,每次爬取的时候尽量用代理来爬,封了代理,还有代理,无穷无尽啊,可别拿代理去黑学校网站啊,你懂得0.0
废话不多说,扔上代理的实现程序

# -*- coding: utf-8 -*-

import urllib2

url = "http://www.ip181.com/"
proxy_support = urllib2.ProxyHandler({'http':'121.40.108.76'})
#参数是一个字典{'类型':'代理ip:端口号'}
opener = urllib2.build_opener(proxy_support)
#定制opener
opener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]
#add_handler给加上伪装
urllib2.install_opener(opener)
response = urllib2.urlopen(url)

print response.read().decode('gbk')

这里采用的测试网站是http://www.ip181.com, 它可以检测出你使用的ip是什么,正好来检验自己是否用代理ip成功

使用代理ip访问

从结果中可以看出,检测出了代理ip,正是我自己加上的ip值,此乃最后一招,当自己ip被封后,采用代理ip进行访问。
要是一个代理ip挂了怎么办,那你可以做个ip池啊,就是把一堆代理ip放在一起,每次运行时从ip池挑一个代理ip当做访问ip就可以了!

采用ip池的方法~~~~~举个栗子

# -*- coding: utf-8 -*-

import urllib2
import random

ip_list=['119.6.136.122','114.106.77.14']
#使用一组ip调用random函数来随机使用其中一个ip
url = "http://www.ip181.com/"
proxy_support = urllib2.ProxyHandler({'http':random.choice(ip_list)})
#参数是一个字典{'类型':'代理ip:端口号'}
opener = urllib2.build_opener(proxy_support)
#定制opener
opener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]
#add_handler给加上伪装
urllib2.install_opener(opener)
response = urllib2.urlopen(url)

print response.read().decode('gbk')
使用ip池抽取ip访问

采用代理ip池的方法,可以看出,检测出的ip是ip池中的一个,对吧,很简单对不对,那么怎么来创建ip池呢,也很简单,用动态或者静态方法随便找个匿名ip的网站进行代理ip爬取,然后清洗一下ip,把能用的(测试一个简单的返回状态网页)留下来写到列表里,然后就可以形成ip池啦,最后当某个ip不能用了,那就从池中剔除!ip池制作,建议参考@七夜的故事--代理ip池


方法4:避开不可见元素陷阱

自己爬着爬着就把隐藏元素都爬出来了,你说你自己是不是爬虫吧,这是网站给爬虫的陷阱,只要发现,立马封IP,所以请查看一下元素再进行爬取!
比如说这个网址,一个简单的登录页面,从审查元素中我们可以看到有一些元素是不可见的!(例子抄自python网络数据采集第12章)

上述中可以看到隐藏的value和不显示的url

查找出陷阱url和不可见的value代码

from selenium import webdriver
#from selenium.webdriver.remote.webelement import WebElement

url = 'http://pythonscraping.com/pages/itsatrap.html'

driver = webdriver.PhantomJS(executable_path="phantomjs.exe")
driver.get(url)
links = driver.find_elements_by_tag_name("a")
for link in links:
    if not link.is_displayed():
        print "the link "+link.get_attribute("href")+"is a trap"

fields = driver.find_elements_by_tag_name("input")
for field in fields:
    if not field.is_displayed():
        print "do not change value of "+field.get_attribute("name")

结果就是

the link http://pythonscraping.com/dontgohereis a trap
do not change value of phone
do not change value of email

方法5:采用分布式爬取

基于Python,scrapy,redis的分布式爬虫实现框架

分布式爬取,针对比较大型爬虫系统,实现步骤如下所示
1.基本的http抓取工具,如scrapy
2.避免重复抓取网页,如Bloom Filter
3.维护一个所有集群机器能够有效分享的分布式队列
4.将分布式队列和Scrapy结合
5.后续处理,网页析取(python-goose),存储(Mongodb)
(知乎上看到的补充一下)

采用Scrapy的例子,请参考这里基于Scrapy对Dmoz进行抓取


方法6:进行模拟登陆

这个就太多了,一般用Selenium,可以结合Firefox或者是无头浏览器PhantomJS,这个做的东西比较多了,如果感兴趣,可以点击这些,进行查看,方法,代码,解析,一应俱全


Pay Attention

1.上述实验的代理ip只对当前数据有效,如果你自己想实验,请自己选择比较新的代理ip,我这个ip可能过一段时间就废了

2.目前我主要采用的方法就是采用加请求头挂上代理ip的方法,对用JS写的网站,requests抓不全数据,所以采用Selenium+PhantomJS/Firefox的方法

3.暂且学到这么多,自己总结了下,以后再补充。


更新

1.于2016.9.1 14:15进行第一次撰写
2.于2016.9.6 17:48进行第二次撰写


致谢

Python网络数据采集[Ryan Mitchell著][人民邮电出版社]
@MrLevo520--Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)
@七夜的故事--代理ip池
@MrLevo520--Selenium+PhantomJS自动续借图书馆书籍(下)
@MrLevo520--基于Selenium一键写CSDN博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 爬虫文章 in 简书程序员专题: like:128-Python 爬取落网音乐 like:127-【图文详解】py...
    喜欢吃栗子阅读 21,629评论 4 412
  • 自己是无意中发现简书这个软件的,因为自己喜欢写东西,只是从小时候就养成了要写日记,摘抄,笔记的习惯,所以至...
    墨雪卿多多阅读 246评论 1 0
  • 这是一本经典的值得推荐的叫你如何学习的书籍。 主题就是在怎么样阅读方面。是不错的一本指导书,书中作者给出关于阅读以...
    SAMSON小黑麦阅读 190评论 0 0
  • 学会提问 《学会提问》被誉为是批判性思维领域的一本圣经,在美国被誉为指导批判性思维“最成功的”书籍之一,在国内,受...
    一枚冰儿阅读 530评论 4 1