前言

在爬取的过程中难免发生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"))

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

方法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:采用分布式爬取

分布式爬取,针对比较大型爬虫系统,实现步骤如下所示

1.基本的http抓取工具,如scrapy

2.避免重复抓取网页,如Bloom Filter

3.维护一个所有集群机器能够有效分享的分布式队列

4.将分布式队列和Scrapy结合

5.后续处理,网页析取(python-goose),存储(Mongodb)

(知乎上看到的补充一下)

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

方法6:进行模拟登陆

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

python怎么暂停爬虫_python Python爬虫防封杀方法集合相关推荐

  1. python爬虫防屏蔽_Python爬虫防封杀方法集合

    我们在进行爬虫时难免发生IP被封和403错误等等,这都是网站检测出你是爬虫而进行的反爬措施,下面我总结了几个避免方法. 方法1:设置等待时间 有一些网站的防范措施可能会因为你快速提交表单而把你当做机器 ...

  2. python sub 不区分大小写_Python网络爬虫入门篇

    1. 预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. Python入门篇:https://www.cnblo ...

  3. 爬虫python对电脑要求_python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学...

    本文由简码编程原创,保留所有版权,转载请注明出处. 本python人工智能爬虫系列教程基于Python3.0版本, 将python结合windows桌面开发工具aardio一起做可视化的开发, 用py ...

  4. python excel操作单元格_python 操作excel表格的方法

    说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...

  5. python怎么清屏_python实现清屏的方法 Python Shell中清屏一般有两种方法。

    Python Shell 怎样清屏? Python Shell中清屏一般有两种方法. 奈何一个人随着年龄增长,梦想便不复轻盈:他开始用双手掂量生活,更看重果实而非花朵.--叶芝<凯尔特的搏暮&g ...

  6. 怎样退出python的交互环境_python交互界面的退出方法

    运行python程序turtle画图,cmd的方式,画完成之后能解决在cmd中运行结束后自动关闭的问题吗? python不关闭控制台的 Python在交互环境敲代码时怎么换行,每次一按EnterPyt ...

  7. python字符串反向输出_Python反向字符串– 5种方法和最佳方法

    python字符串反向输出 Python String doesn't have a built-in reverse() function. However, there are various w ...

  8. python微信自动回复代码_Python 实现微信自动回复的方法

    众所周知QQ上面是可以设置自动回复的,但是微信上面并不可以.最近在学习Python,发现Python的适用范围是真的很广,这里使用itchat组件实现微信的自动回复 1:安装itchat pip in ...

  9. python删除特定文件_python删除特定文件的方法 -电脑资料

    作者:技术芝麻点 字体:[增加 减小] 类型:转载 这篇文章主要介绍了python删除特定文件的方法,涉及Python文件查找及删除的相关技巧,需要的朋友可以参考下 本文实例讲述了python删除特定 ...

最新文章

  1. [云炬创业基础笔记]第二章创业者测试9
  2. Tomcat打包时多项目共享jar和精确指定jar版本
  3. 本地计算机绑定域名访问
  4. fcfs调度算法_FCFS:先来先服务调度算法
  5. 最新版MySQL在MacOS上的实践!
  6. 三星电子预计第四季度营业利润为9万亿韩元 低于分析师预期
  7. java线程如何继承,java多线程(一)之继承Thread类
  8. 2.12 向量化的更多例子
  9. Serve Django Applications with uWSGI and Nginx
  10. 百度运维部电子竞技大赛!
  11. 《算法导论》(CLRS)第三版 第3章总结
  12. 『GDAL』读写TIFF文件
  13. 虚拟机黑裙加载硬盘_在Promox VE(PVE)虚拟机安装黑群晖并开启硬盘休眠的方法...
  14. 微信小程序语音识别java_微信小程序实现语音识别功能
  15. 小侃设计模式(八)-装饰者模式
  16. it工种分类_什么是运维?运维工种有哪些
  17. JSFL批量删除fla文件中超出某个宽度的原件
  18. 计算机组成原理课程设计_微程序控制的运算器设计
  19. Mixly16:震动报警器
  20. ARC 101 E - Ribbons on Tree

热门文章

  1. 明确C++风格的类型转换的用法
  2. Visual C#设计多功能关机程序
  3. 62个电脑常用快捷键大全,一次分享,果断收藏!
  4. 无监督学习 | DBSCAN 原理及Sklearn实现
  5. Hepatology | 朱黎琴/于吉洋团队合作揭示新生儿肝脏发育中肝母细胞瘤转移的新机制...
  6. 在 Mac 上创建和移除替身
  7. Mac重复文件清理软件—Cisdem Duplicate Finder for mac
  8. 小程序滑动到底部进行分页的功能实例
  9. EXCEL表格转换成json数据工具
  10. 09花冠钥匙计算机电路图,丰田花冠轿车发动机防盗系统设定