反反爬虫 IP代理

0x01 前言

一般而言,抓取稍微正规一点的网站,都会有反爬虫的制约。反爬虫主要有以下几种方式:

  1. 通过UA判断。这是最低级的判断,一般反爬虫不会用这个做唯一判断,因为反反爬虫非常容易,直接随机UA即可解决。
  2. 通过单IP频繁访问判断。这个判断简单,而且反反爬虫比较费力,反爬虫绝佳方案。需采用多IP抓取。
  3. 通过Cookie判断,例如通过会员制账号密码登陆,判断单账号短时间抓取次数判断。这个反反爬虫也很费力。需采用多账号抓取。
  4. 动态页面加载。这个考验前端工程师的功底,如果前端写的好,各种JS判断,各种逻辑,像百度,淘宝一样,post登录很难。较好的方法,但是对于大牛,还是防不胜防。反反爬虫多采用渲染浏览器抓取,效率低下。
  5. 采用验证码。这里要么是登录的时候有验证码,要么是判断是爬虫时,不封IP,而是采用验证码验证,例如链家网。验证码是反爬虫性价比较高的方案。反反爬虫一般接入OCR验证码识别平台或者人工打码平台,亦或者利用Tesseract OCR识别,亦或者采用神经网络训练识别验证码等。

0x02 概要

今天我们先主要来讲一讲,如何应对第2条的反反爬虫,如何通过多IP抓取。

通过多IP爬虫,又分为以下几种形式:

  1. 通过ADSL拨号换IP。每拨一次就会有一个新IP,较好解决IP单一问题。
  2. 如果是局域网,带路由器的,第一种方法可能不好用。这个时候可以模拟登陆路由器,控制路由器重新拨号,换IP,这其实是一种折中的办法,曲线救国。
  3. 代理IP,利用购买的或者网上抓取的免费代理IP,实现多IP爬虫。
  4. 分布式爬虫。采用多个服务器,多个IP,多个slave爬虫同时运行,由master负责调度。效率较高,属于大型分布式抓取,一般用redis分布式抓取,不表。
  5. 最近了解到一种新的加密的代理网络。Tor匿名网络,利用这个也能匿名换IP。这个还没有详细了解,不表。

0x03 正文

1. ADSL拨号

我一般是在windows平台ADSL拨号,其他平台暂时没用过。windows平台拨号,我一般用python的代码为:

# -*- coding: utf-8 -*-
import os

g_adsl_account = {"name": u"宽带连接",
                "username": "xxxx",
                "password": "xxxx"}

class Adsl(object):
    # =============================
    # __init__ : name: adsl名称
    # =============================
    def __init__(self):
        self.name = g_adsl_account["name"]
        self.username = g_adsl_account["username"]
        self.password = g_adsl_account["password"]

    # =============================
    # set_adsl : 修改adsl设置
    # =============================
    def set_adsl(self, account):
        self.name = account["name"]
        self.username = account["username"]
        self.password = account["password"]

    # =============================
    # connect : 宽带拨号
    # =============================
    def connect(self):
        cmd_str = "rasdial %s %s %s" % (self.name, self.username, self.password)
        os.system(cmd_str)
        time.sleep(5)

    # =============================
    # disconnect : 断开宽带连接
    # =============================
    def disconnect(self):
        cmd_str = "rasdial %s /disconnect" % self.name
        os.system(cmd_str)
        time.sleep(5)

    #=============================
    # reconnect : 重新进行拨号
    #=============================
    def reconnect(self):
        self.disconnect()
        self.connect()

2. 路由器拨号

如果是局域网,带路由器的。直接调用windows的rasdial命令无法拨号时,这个时候可以模拟登陆路由器,控制路由器重新拨号,换IP,这其实是一种折中的办法,曲线救国。下面以登录小米路由器示例:

# -*- coding: utf-8 -*-
import requests
import urllib
from Crypto.Hash import SHA
import time
import json
import re
import random
import datetime

class Adsl():
    def __init__(self):
        self.host = ‘192.168.31.1/‘
        self.username = ‘admin‘
        self.password = ‘huangxin250‘

    def connect(self):
        host = self.host
        homeRequest = requests.get(‘http://‘ + host + ‘/cgi-bin/luci/web/home‘)
        key = re.findall(r‘key: \‘(.*)\‘,‘, homeRequest.text)[0]
        mac = re.findall(r‘deviceId = \‘(.*)\‘;‘, homeRequest.text)[0]
        aimurl = "http://" + host + "/cgi-bin/luci/api/xqsystem/login"
        nonce = "0_" + mac + "_" + str(int(time.time())) + "_" + str(random.randint(1000, 10000))
        pwdtext = self.password
        pwd = SHA.new()
        pwd.update(pwdtext + key)
        hexpwd1 = pwd.hexdigest()
        pwd2 = SHA.new()
        pwd2.update(nonce + hexpwd1)
        hexpwd2 = pwd2.hexdigest()
        data = {
            "logtype": 2,
            "nonce": nonce,
            "password": hexpwd2,
            "username": self.username
        }
        response = requests.post(url=aimurl, data=data, timeout=15)
        resjson = json.loads(response.content)
        token = resjson[‘token‘]
        webstop = urllib.urlopen(‘http://192.168.31.1/cgi-bin/luci/;stok=‘ + token + ‘/api/xqnetwork/pppoe_stop‘)
        #time.sleep(1)
        webstart = urllib.urlopen(‘http://192.168.31.1/cgi-bin/luci/;stok=‘ + token + ‘/api/xqnetwork/pppoe_start‘)
        date = datetime.datetime.now()
        nowtime = str(date)[:-10]
        print nowtime + ‘, congratulations, the IP is changed !‘

  

利用这个方法,就实现了用路由器换IP的目的。该方法的缺陷也是很明显的。就是不像第一种方法那样通用。基本上一个路由器就得编一套代码,属于定制代码。

3. 代理IP

代理IP是最常见的一种多IP爬虫方法。在请求Headers中加入代理IP地址,即可实现代理IP抓取。缺陷是爬取速度和代理IP的速度息息相关。而且好的IP费用较高,免费的速度普遍不高。

附上requests抓取携带代理IP和selenium抓取携带代理IP的代码。

requests:

# -*- coding: utf-8 -*-
import requests
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
type = sys.getfilesystemencoding()
s = requests.session()
proxie = {
        ‘http‘ : ‘http://122.193.14.102:80‘
    }
url = ‘xxx‘

response = s.get(url, verify=False, proxies = proxie, timeout = 20)
print response.text

selenium:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
proxy = Proxy(
    {
        ‘proxyType‘: ProxyType.MANUAL,
        ‘httpProxy‘: ‘ip:port‘
    }
)

desired_capabilities = DesiredCapabilities.PHANTOMJS.copy()
proxy.add_to_capabilities(desired_capabilities)
driver = webdriver.PhantomJS(
    executable_path="/path/of/phantomjs",
    desired_capabilities=desired_capabilities
    )
driver.get(‘http://httpbin.org/ip‘)
print driver.page_source
driver.close()
时间: 2024-10-09 23:35:52

反反爬虫 IP代理的相关文章

八 web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener()初始化IPinstall_opener()将代理IP设置成全局,当使用urlopen()请求时自动使用代理IP #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib import urllib.request import random #引入随机模块文件 ip = "180.115.8.21

爬虫爱好者分析一下什么样的高匿爬虫IP代理性价比最高?

随着互联网的高速发展,无论是不是互联网企业都开始了大数据采集与分析,建立自己的大数据库,从而催生了无数的数据采集公司,也就是我们所说的网络爬虫.网络蜘蛛,网络爬虫在进行数据采集的时候需要用到大量的代理IP,那么究竟是什么样的代理IP才具备高性价比呢?也许有人会脱口而出,当然是免费的代理IP最具有性价比啊.可是真的是这样吗?咱们来分析看看. 目前代理IP有免费的,也有付费的IP代理,但是说到性价比,可能很多朋友会想当然地觉得,免费的代理IP应该是性价比最高的,毕竟不花钱嘛.但是持这个观点的朋友压根

快速构建Python爬虫IP代理池服务

在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来.不过呢,闲暇时间手痒,所以就想利用一些免费的资源搞一个简单的代理池服务. 1.问题 代理IP从何而来? 刚自学爬虫的时候没有代理IP就去西刺.快代理之类有免费代理的网站去爬,还是有个别代理能用.当然,如果你有更好的代理接口也可以自己接入. 免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取

爬虫IP代理池

下载安装 下载源码: git clone [email protected]:jhao104/proxy_pool.git 或者直接到https://github.com/jhao104/proxy_pool/releases 下载zip文件 安装依赖: pip install -r requirements.txt 配置Config/setting.py: # Config/setting.py 为项目配置文件 # 配置DB DATABASES = { "default": { &q

高匿ip代理对爬虫的重要性。什么是高匿ip代理?

对于爬虫来说,在听到ip代理的时候,听得最多的莫过于透明代理.匿名代理.高匿代理这几个词了,那么分别是什么意思呢?互相之间有什么样的区别呢? 为什么说爬虫ip代理一定要使用高匿代理呢? 带着这些问题,让飞蚁代理为您来揭开匿名级别的面纱. 第一高匿名:服务器不知道你使用了代理ip和不知道你真实ip第二匿名:服务器知道你使用了代理ip但不知道你的真实ip第三透明:服务器知道你使用了代理ip而且知道你真实ip 高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真

打造IP代理池,Python爬取Boss直聘,帮你获取全国各类职业薪酬榜

爬虫面临的问题 不再是单纯的数据一把抓 多数的网站还是请求来了,一把将所有数据塞进去返回,但现在更多的网站使用数据的异步加载,爬虫不再像之前那么方便 很多人说js异步加载与数据解析,爬虫可以做到啊,恩是的,无非增加些工作量,那是你没遇到牛逼的前端,多数的解决办法只能靠渲染浏览器抓取,效率低下,接着往下走 ? 千姿百态的登陆验证 从12306的说说下面哪个糖是奶糖,到现在各大网站的滑动拼图.汉子点击解锁,这些操作都是在为了阻止爬虫的自动化运行. 你说可以先登录了复制cookie,但cookie也有

爬虫反反爬虫:转

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:xlzd链接:http://www.zhihu.com/question/34980963/answer/60627797来源:知乎 爬虫自动换User-Agent在代码实现上只需要一句就够了,并不是什么高难度的技术活.爬虫为什么要换不同的User-Agent呢,无非就是为了模拟浏览器,让服务器不容易识别出自己是爬虫. 对于爬虫,其实上上策是爬网站之前先去读一下网站的『robots.txt』文件,看看网站开发者(或网站主人

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider)

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔... Day 1小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库.这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(1.1.1.1)这个用户,并且 useragent 还是 JavaClient1.6 ,基于这两点判断非人类后直接在Nginx 服务器上封杀.

Python爬虫之ip代理池

可能在学习爬虫的时候,遇到很多的反爬的手段,封ip 就是其中之一. 对于封IP的网站.需要很多的代理IP,去买代理IP,对于初学者觉得没有必要,每个卖代理IP的网站有的提供了免费IP,可是又很少,写了个IP代理池 .学习应该就够了 ip代理池: 1,在各大网站爬去免费代理ip2,检查ip可用 可用存入数据库1和23,在数据库1中拿出少量代理ip存入数据库2(方便维护)4,定时检查数据库1和数据库2的代理数量,以及是否可用5,调用端口 1,在各大网站爬去免费代理ip 1 def IPList_61