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 urllib2req = 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 urllib2url = "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 randomip_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 WebElementurl = '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,这个做的东西比较多了,如果感兴趣,可以点击这些,进行查看,方法,代码,解析,一应俱全

  • Selenium+PhantomJS自动续借图书馆书籍(下)
  • Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)
  • 基于Selenium一键写CSDN博客

Pay Attention

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

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

Python爬虫防封杀方法集合相关推荐

  1. python怎么暂停爬虫_python Python爬虫防封杀方法集合

    前言 在爬取的过程中难免发生ip被封和403错误等等,这都是网站检测出你是爬虫而进行反爬措施,这里自己总结下如何避免 方法1:设置等待时间 有一些网站的防范措施可能会因为你快速提交表单而把你当做机器人 ...

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

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

  3. python爬虫防屏蔽_python爬虫程序如何预防被限制

    有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份.此时,我们就可以通过设置Use ...

  4. python爬虫防呆笔记:正则表达式篇之一

    python爬虫笔记 第一部分:正则表达式 基本效果展示 加载猫眼电影网的html文本作为训练文本 这里先讲一下header,这里的header就写一项,不写就爬不出来,这一项是User-Agent, ...

  5. python爬虫登录网站_主流网站 Python 爬虫模拟登陆方法汇总

    欢迎关注我的公众号:高级农民工,博客:高级农民工,阅读体验更好. 摘要:介绍微信.知乎.新浪等一众主流网站的模拟登陆爬取方法. 网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样.从 ...

  6. Python爬取网站用户手机号_主流网站 Python 爬虫模拟登陆方法汇总

    欢迎关注我的公众号:高级农民工,博客:高级农民工,阅读体验更好. 摘要:介绍微信.知乎.新浪等一众主流网站的模拟登陆爬取方法. 网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样.从 ...

  7. python爬虫步骤-Docker部署Python爬虫项目的方法步骤

    1) 首先安装docker: # 用 yum 安装并启动 yum install docker -y && systemctl start docker 2) 下载自定义镜像需要用到的 ...

  8. python爬虫之类的方法爬取一部小说

    面向对象编程,爬取一部小说 ''' 面向对象编程 爬取17K小说网一部小说 ''' # 导入第三方库 import os import requests from lxml import etree ...

  9. 【python爬虫】面向对象方法实现斗图网案例

    文章目录 前言

  10. Python爬虫学习手册

    like:128-Python 爬取落网音乐 like:127-[图文详解]python爬虫实战--5分钟做个图片自动下载器 like:97-用Python写一个简单的微博爬虫 like:87-爬虫抓 ...

最新文章

  1. android ble5.0添加扫描过滤,bluetooth-lowenergy
  2. EventBus源码解析
  3. Azure CosmosDB (3) 选择适当的一致性级别
  4. struts2教程(5)--请求参数校验
  5. C++ POD与结构体声明
  6. java hive demo_java 操作hive通过jdbc
  7. centos 安装jdk_centos7配置jdk
  8. linux so文件统一目录,linux加载指定目录的so文件
  9. python爬取网页文本_手把手教你如何用Python爬取网站文本信息
  10. WPF 自定义柱状图 BarChart
  11. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——01-06 工作内容:做个工程师,而非程序工人...
  12. java实现modbus rtu协议与 modscan等工具(2)
  13. 500G JAVA视频网盘分享 JEECG开源社区
  14. Python网络编程之网络基础
  15. OSPF三种验证配置
  16. 海龟编辑器怎么运行html,怎么使用海龟编辑器
  17. 十种常见的代码编辑器
  18. python代理池_进击:用Python搭建高匿代理池
  19. 下列哪个不是java中注释,下面那些选项是Java中的注释方式:
  20. SQL语句——基础篇

热门文章

  1. Godot—2D游戏设计笔记
  2. Intellij IDEA快捷键大全(超详细)
  3. idea快捷键最全最新最好
  4. 微信支付开发文档说明
  5. 石油化工行业的MES系统解决方案
  6. 自动控制原理复习第七章——非线性系统分析
  7. 2022.3.6总结非线性系统线性化方法,第五章
  8. ViewStub 简介
  9. 项目实施工程师的工作
  10. 匹配区县代码_北京各区县代码都是多少?