python Python爬虫防封杀方法集合

前言

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

方法1:设置等待时间

有一些网站的防范措施可能会由于你快速提交表单而把你当作机器人爬虫,好比说以很是人的速度下载图片,登陆网站,爬取信息。html

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

1.显性等待时间web

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

并且尽可能在夜深人静的时候进行数据的采集,切记采集不要太快,否则容易让网站识别出你个非人类redis

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

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,因此要进行修改。less

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
废话很少说,扔上代理的实现程序dom

# -*- 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,这个作的东西比较多了,若是感兴趣,能够点击这些,进行查看,方法,代码,解析,包罗万象

相关文章
相关标签/搜索