python爬虫有什么办法防止网站被爬虫抓取反爬虫

如何让你的scrapy爬虫不再被ban之二(利用第三方平台crawlera做scrapy爬虫防屏蔽)-爱编程
如何让你的scrapy爬虫不再被ban之二(利用第三方平台crawlera做scrapy爬虫防屏蔽)
  我们在做scrapy爬虫的时候,爬虫经常被ban是常态。然而前面的文章,介绍了scrapy爬虫防屏蔽的各种策略组合。前面采用的是禁用cookies、动态设置user agent、代理IP和VPN等一系列的措施组合来防止爬虫被ban。除此以外官方文档还介绍了采用Google cache和crawlera的方法。这里就着重介绍一下如何利用crawlera来达到爬虫不被ban的效果。crawlera是一个利用代理IP地址池来做分布式下载的第三方平台,除了scrapy可以用以外,普通的java、php、python等都可以通过curl的方式来调用。好了,下面入正题。
  说明:
  本文章是基于前面的一系列文章完成的,如果您错过了。可以在此查看:
  crawlera官方网址:
  crawlera帮助文档:
  一、注册crawlera账号,获取crawlera API KEY
  1、注册一个crawlera账号并激活
  /account/signup/
  填写好用户名,邮件和密码点击sign up即完成注册,收到注册确认邮件确认即可。
  2、创建一个Organizations
  3、创建完Organizations后添加crawlera user
  4、查看API key
  点击的名称就可以查看的详细信息了()
  至此,crawlera API的信息已经获取到了。
  二、修改scrapy项目
  下面看看怎么添加到scrapy项目
  1、安装scrapy-crawlera
pip install scrapy-crawlera
  2、修改settings.py
  DOWNLOADER_MIDDLEWARES下添加配置项
'scrapy_crawlera.CrawleraMiddleware': 600
  其他配置项
CRAWLERA_ENABLED = True
CRAWLERA_USER = '&API key&'
CRAWLERA_PASS = '你crawlera账号的密码'
  注意:由于之前的项目用了自定义代理的方式,因此DOWNLOADER_MIDDLEWARES下的
#'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, #代理需要用到
#'cnblogs.middlewares.ProxyMiddleware': 100, #代理需要用到
  这两个配置项要注释掉。
  3、测试crawlera的抓取是否可用
scrapy crawl CnblogsSpider
  4、查看结果
  这里可以看到crawlera已经正常工作了。
  5、另外crawlera官网也可以查看抓取结果
  scrapy运用crawlera进行抓取就介绍到这里。另外crawlera还提供付费定制服务,如果经费充足也可以考虑付费定制scrapy的爬虫。
  代码更新至此:(提交到github的代码将api和password去掉了,如果想运行需要添加自己的key和password)
  三、题外话:
  如果你不是scrapy爬虫,而仅仅是想python调用,crawlera也提供了python直接调用的方法
  1、通过request的方式
import requests
proxy = ":8010"
proxy_auth = "&API KEY&:"
proxies = {
"http": "http://{0}@{1}/".format(proxy_auth, proxy)
headers = {
"X-Crawlera-Use-HTTPS": 1
r = requests.get(url, proxies=proxies, headers=headers)
Requesting [{}]
through proxy [{}]
Response Time: {}
Response Code: {}
Response Headers:
Response Body:
""".format(url, proxy, r.elapsed.total_seconds(), r.status_code, r.headers, r.text))
  2、request代理重写url
import requests
from requests.auth import HTTPProxyAuth
headers = {}
proxy_host = ""
proxy_auth = HTTPProxyAuth("&API KEY&", "")
proxies = {"http": "http://{}:8010/".format(proxy_host)}
if url.startswith("https:"):
url = "http://" + url[8:]
headers["X-Crawlera-Use-HTTPS"] = "1"
r = requests.get(url, headers=headers, proxies=proxies, auth=proxy_auth)
Requesting [{}]
through proxy [{}]
Response Time: {}
Response Code: {}
Response Headers:
Response Body:
""".format(url, proxy_host, r.elapsed.total_seconds(), r.status_code,
r.headers, r.text))
  crawlera就介绍到这里,更多关于crawlera的内容可以参考官方文档:
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。Posts - 264,
Articles - 1,
Comments - 2346
大人不华,君子务实。
独立博客:
00:18 by 虫师, ... 阅读,
  在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。
  我们最常规的做法就是通过鼠标右键,选择另存为。但有些图片鼠标右键的时候并没有另存为选项,还有办法就通过就是通过截图工具截取下来,但这样就降低图片的清晰度。好吧~!其实你很厉害的,右键查看页面源代码。
  我们可以通过来实现这样一个简单的爬虫功能,把我们想要的代码爬取到本地。下面就看看如何使用来实现这样一个功能。
一,获取整个页面数据
首先我们可以先获取要下载图片的整个页面信息。
#coding=utf-8
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
html = getHtml("/p/")
print html
  Urllib&模块提供了读取页面数据的接口,我们可以像读取本地文件一样读取www和上的数据。首先,我们定义了一个函数
  urllib.urlopen()方法用于打开一个地址。
  read()方法用于读取上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
二,筛选页面中想要的数据
  Python&提供了非常强大的正则表达式,我们需要先要了解一点正则表达式的知识才行。
假如我们百度贴吧找到了几张漂亮的壁纸,通过到前段查看工具。找到了图片的地址,如:pic_ext=&jpeg&
修改代码如下:
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
return imglist
html = getHtml("/p/")
print getImg(html)
  我们又创建了函数,用于在获取的整个页面中筛选需要的图片连接。模块主要包含了正则表达式:
  re.compile()&可以把正则表达式编译成一个正则表达式对象.
  re.findall()&方法读取中包含&(正则表达式)的数据。
&  &运行脚本将得到整个页面中包含图片的地址。
三,将页面筛选的数据保存到本地
把筛选的图片地址通过循环遍历并保存到本地,代码如下:
#coding=utf-8
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
html = getHtml("/p/")
print getImg(html)
  这里的核心是用到了urllib.urlretrieve()方法,直接将远程数据下载到本地。
  通过一个循环对获取的图片连接进行遍历,为了使图片的文件名看上去更规范,对其进行重命名,命名规则通过变量加。保存的位置默认为程序的存放目录。
程序运行完成,将在目录下看到下载到本地的文件。运用phantomjs无头浏览器破解四种反爬虫技术 - Python - 伯乐在线
& 运用phantomjs无头浏览器破解四种反爬虫技术
在与反爬虫的对抗中,我们爬虫的大招有两个,其一是多种ip跟换方式(例如adsl|代理|tor等请参看之前的文章)。其二是无头浏览器,使用自动化的技术来进行自动数据抓取,模拟鼠标与键盘事件,可以用于破解验证码,js解析,诡异的模糊数据这类型的反爬虫技术。
1 phantomjs原理说明:
无头浏览器不是什么闹鬼的东西,他也称为无界面浏览器,他本身是用来做自动化测试的,不过似乎更适合用来搞爬虫。他的官方网址是:http://phantomjs.org/quick-start.html 如果想看他的中文api的话我整理了一份资料在:。
下载之后会得到个一个exe文件,linux下也一样。在命令行则是在该文件的目录下输入 phantomjs
就算是用该浏览器启动你的爬虫代码。
下列js代码就是需要运行phantomg
保存为request.js文件。然后在当前目录下命令行运行:就会返回整个网页的源码,然后爬虫你懂得的小解析一下就可以抽取出xici代理的免费ip了。
phantomjs request.js /
phantomjs request.js http:///
JavaScript
/***********************************
code:javascript
system:win
auther: luyi
github: luyishisi
blog: https://www.urlteam.org
逻辑说明:使用phantomjs无界面浏览器作为操作平台,破解对方针对js解析的反爬虫辨别
************************************/
var page = require('webpage').create(),
system = require('system'),
address = system.args[1];
//init and settings
page.settings.resourceTimeout = 30000 ;
page.settings.XSSAuditingEnabled =
//page.viewportSize = { width: 1000, height: 1000 };
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0. Safari/537.36';
page.customHeaders = {
"Connection" : "keep-alive",
"Cache-Control" : "max-age=0",
"Accept": "text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,q=0.8,q=0.6",
page.open(address, function() {
console.log(address);
console.log('begin');
//加载页面完毕运行
page.onLoadFinished = function(status) {
console.log('Status: ' + status);
console.log(page.content);
phantom.exit();
123456789101112131415161718192021222324252627282930313233343536
/***********************************code:javascriptsystem:win
linuxauther: luyimail : github: luyishisiblog: https://www.urlteam.orgdate:逻辑说明:使用phantomjs无界面浏览器作为操作平台,破解对方针对js解析的反爬虫辨别************************************/var page = require('webpage').create(),
system = require('system'),
address;address = system.args[1]; //init and settingspage.settings.resourceTimeout = 30000 ;page.settings.XSSAuditingEnabled = true ;//page.viewportSize = { width: 1000, height: 1000 };page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0. Safari/537.36';page.customHeaders = {
"Connection" : "keep-alive",
"Cache-Control" : "max-age=0",
"Accept": "text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,q=0.8,q=0.6",};page.open(address, function() {
console.log(address);
console.log('begin');});//加载页面完毕运行page.onLoadFinished = function(status) {
console.log('Status: ' + status);
console.log(page.content);
phantom.exit();};
3 破解基础的js解析能力限制
遇到过两种其一是该网站故意用js做了延迟返回真实数据,先返回一部分,之后再进行几秒的js能力验证后加载。另外一种则检测是无js处理能力当即就给出拒绝码,这类型就是xici代理的方式,如果你用python直接发送请求,无论是scrapy还是requests,都会返回500错误。如下:
但是如果你使用上面牛刀小试的代码,在python中用系统指令调用这行命令,则相当于用phantomjs来执行请求操作,源代码就会直接返回。可以用python用下列
common = 'c://phantomjs/phantomjs' + ' requests.js '+ temp_url
str_body =
str(os.popen(common).read())
print str_body
common = 'c://phantomjs/phantomjs' + ' requests.js '+ temp_urlstr_body =
str(os.popen(common).read())print str_body
之后就是字符串处理,很简单不废话了。
4 破解采用display:none来随机化网页源码
总所周知,我们在爬虫中想要选出某个需要的数据,可以使用xpath或者正则这类字符串的操作,然而必然需要对方的网站有一定规律,才能合理的抽出数据,因此也有使用nodisplay这个属性,让显示的后台代码十分混乱,但是前台呈现给用户的数据并不会混乱比如:/
如图,我使用chrome来检测这ip部分的源代码的时候就会出现后台乱七八糟的显示情况,有网站还会随机类的名字,让更加不好捕捉。
然后破解方式也曲线救国。
破解思路:(避免查水表不发布源代码)
使用phantomjs的截图功能。(具体查官方api。并不困难,其样例代码中rasterize.js 这一篇也是实现截图的功能)例如:
JavaScript
page.evaluate(function() {
document.body.bgColor = 'white';});//背景色设定为白。方便二值化处理
page.clipRect = { top: 441, left: 364, width: 300, height: 210 };//指定截图区域。坐标使用第四象限
page.evaluate(function() {
document.body.bgColor = 'white';});//背景色设定为白。方便二值化处理page.clipRect = { top: 441, left: 364, width: 300, height: 210 };//指定截图区域。坐标使用第四象限
然后单独取出ip和port部分的图片。使用python进行图文转换。大致如下:
安装PIL中image库
遍历每一个像素点,做一个锐化加强对比去除杂色和二值化,保存改良过的图片。
调用pytesseract 运行函数:print pytesseract.image_to_string(Image.open(‘end.png’))
如果你的图像处理的比较清晰就可以轻松识别出图文。
注意好切割图片,不要整个图片一次性的识别,最好能单独切出一个ip。然后进行识别,准确性高。主要的难度其实是安装环境和图片优化比较麻烦。
5 破解简单的图片文字相互替代
这部分和上个问题也相当重合:相当于是对方把一些数据变成图片,而我们则是下载这些图片然后进行图片优化,然后解析比如:/
当抓取他的页面的时候,ip好抓,但是端口号是图片的。下载图片之后还是需要做好上诉转换。识别起来准确性也是95%+
这方面给三个传送门自行学习:
简单数字去噪二值化识别:/demo_c122_i2907.html
验证码破解原理:/doc/ae/920457.html
机器学习式破解:https://www.91ri.org/13043.html
6 破解拖动验证码
破解只是兴趣而已,总不能砸别人饭碗。只是提一下思路:
截取触发前后的验证码图片。运用变化点作为二值化可以得出需要偏移的像素点
phantomjs控制鼠标进行拖动
唯一困难的就是拖动的轨迹不能是太机器化,否则你的验证码会被吃掉。
还有别人使用ajax等跳过请求,也是一种方式不过也挺难的。
请勿私信问代码。没留。
与反爬虫进行斗争,如果你能熟练使用上诉的技巧就基本无往而不利了。
使用adsl | tor | 代理 | 可以让对方无法针对ip封禁,使用header的字段伪造,算是入门防止对方识别并返回假数据。使用phantoms则基本对方不能阻止你的访问。毕竟是真实的浏览器发起的请求。现在还能存在的漏洞就是可以通过一些特性检测识别出你使用的是phantoms浏览器然后阻止,能实现这个的网站也不多。另外还有困难的就是复杂的验证码破解的,只有机器学习一条路了。
本文仅作技术分享,不公布破解源代码,希望读者可以互相学习,增长技艺。
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
关于作者:
可能感兴趣的话题
o 162 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 如何防止网络爬虫 的文章

 

随机推荐