一对一免费咨询: 13913005726 025-66045668

文/mrlevo520

Python 2.7IDE

Pycharm 5.0.3

前言
在爬取的过程中难免发生ip被封和403错误等等,这都是网站检测出你是爬虫而进行反爬措施,这里自己总结下如何避免。
方法1:设置等待时间

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

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

1.显性等待时间

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

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

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

wait1.until(lambdadriver: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,所以要进行修改。

importurllib2

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

response=urllib2.urlopen(req)

方法3:采用代理ip

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

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

importurllib2

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(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/45.0.2454.101Safari/537.36')]#add_handler给加上伪装

urllib2.install_opener(opener)

response=urllib2.urlopen(url)

printresponse.read().decode('gbk')

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

使用代理ip访问

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

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

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

importurllib2

importrandom

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(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/45.0.2454.101Safari/537.36')]#add_handler给加上伪装

urllib2.install_opener(opener)

response=urllib2.urlopen(url)

printresponse.read().decode('gbk')

使用ip池抽取ip访问

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

方法4:避开不可见元素陷有关设计的网站阱

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

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

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

fromseleniumimportwebdriver#fromselenium.webdriver.remote.webelementimportWebElementurl='http://pythonscraping.com/pages/itsatrap.html'driver=webdriver.PhantomJS(executable_path="phantomjs.exe")

driver.get(url)

links=driver.find_elements_by_tag_name("a")forlinkinlinks:ifnotlink.is_displayed():print"thelink"+link.get_attribute("href")+"isatrap"fields=driver.find_elements_by_tag_name("input")forfieldinfields:ifnotfield.is_displayed():print"donotchangevalueof"+field.get_attribute("name")

结果就是

thelinkhttp://pythonscraping.com/dontgohereisatrapdonotchangevalueofphonedonotchangevalueofemail
方法5:采用分布式爬取

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

分布式爬取,针对比较大型爬虫系统,实现步骤如下所示1.基本的http抓取工具,如scrapy2.避免重复抓取网页,如Bloom 金华网站建设公司 Filter3.维护一个所有集群机器能够有效分享的分布式队列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的方法

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


 


 南京牧狼文化传媒有限公司简介:


      牧狼传媒,牧者之心,狼者之性,以牧之谦卑宽容之心待人,以狼之团结无畏之性做事!


  公司注册资金100万,主营众筹全案服务、网站营销全案服务、网站建设、微信小程序开发、电商网店设计、H5页面设计、腾讯社交广告投放以及电商营销推广全案等相关业务,致力于为客户提供更有价值的服务,创造让用户满意的效果!


  为百度官方及其大客户、苏宁易购、金山WPS秀堂、美的、创维家电、新东方在线、伊莱克斯、宝丽莱等国内国外知名品牌服务过,服务经验丰富!同时,公司也是南京电子商务协会会员单位、猪八戒网官方认证签约服务商、江苏八戒服务网联盟、南京浦口文化产业联合会会员单位,可以为您提供更好的服务!


  主营项目:众筹全案服务、网站营销全案服务、网站建设、微信小程序开发、电商网店设计、H5页面设计、腾讯社交广告投放、竞价托管、网站优化、电商代运营等


  合作客户:百度、苏宁易购、饿了么、美的、创维家电、新东方在线、宝丽莱、金山WPS秀堂、伊莱克斯


  资质荣誉:百度商业服务市场2017年度最佳图片服务商、南京电子商务协会会员单位、猪八戒网官方认证签约服务商、江苏八戒服务网联盟、南京浦口文化产业联合会会员单位、八戒通TOP服务商、"易拍即合杯"H5创意大赛"三等奖"。



致力于为客户创造更多价值
13913005726 025-66045668
需求提交
电话咨询
在线咨询