page contents

Python爬虫防封杀方法集合

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

们在进行爬虫难免发生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 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的方式进行爬取。所以我建议,每次爬取的时候尽量用代理来爬,封了代理,还有代理,无穷无尽啊。代理的实现程序:

# -*- 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)#定制openeropener.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成功。

attachments-2019-12-9YhcIVaf5e0572dfb594f.png
(使用代理ip访问)


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

# -*- coding: utf-8 -*-import urllib2import randomip_list=['119.6.136.122','114.106.77.14']#使用一组ip调用random函数来随机使用其中一个ipurl = "http://www.ip181.com/"proxy_support = urllib2.ProxyHandler({'http':random.choice(ip_list)})#参数是一个字典{'类型':'代理ip:端口号'}opener = urllib2.build_opener(proxy_support)#定制openeropener.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')


attachments-2019-12-2oQaH9U75e05730734e9f.png
(使用ip池抽取ip访问)


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

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 trapdo not change value of phonedo not change value of email


方法5:采用分布式爬取


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


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


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


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


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


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


最后:


1.上述实验的代理ip只对当前数据有效,如果你自己想实验,请自己选择比较新的代理ip。


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

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-06-TCPqMKQ862a43a2b44d97.jpeg


  • 发表于 2019-12-27 10:58
  • 阅读 ( 772 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章