多ip服务器绑定ip发送请求(requests和scrapy)

多ip服务器绑定ip发送请求(requests和scrapy)

有时候我们会购买多ip服务器(站群服务器),来满足特定的需求,比如建站,SEO等。

多ip服务器通常是ip越多价格越贵,ip段也有优劣之分。

对于爬虫而言,200多个ip,合理利用的话也可以满足很多需求了。

本篇文章针对python的两个爬虫库:requests和scrapy,怎么绑定指定ip发送请求做的整理笔记。

1、获取本机所有ip

第一步就是要知道本机有多少可用的ip。

import psutil


def get_local_ips():
    """获取本机所有ip"""
    local_ips = []
    info = psutil.net_if_addrs()
    for k, v in info.items():
        if "eth" in k:
            for item in v:
                if item[0] == 2:
                    local_ips.append(item[1])
    # # 去掉原始ip
    # local_ips = local_ips[1:]
    print("本机ip数量:", len(local_ips), local_ips)
    return local_ips

2、requests

主要是使用SourceAddressAdapter绑定ip,发送请求。

from requests_toolbelt import SourceAddressAdapter

def adapter_requests(self):
    """随机绑定一个本机ip"""
    bind_address = random.choice(self.ips)
    print("请求ip:", bind_address)
    new_source = SourceAddressAdapter(bind_address)
    self.session.mount('http://', new_source)
    self.session.mount('https://', new_source)

3、测试requests请求

利用http://httpbin.org/get网站来测试请求ip。

总代码为:

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

import random
import psutil
import requests
from requests_toolbelt import SourceAddressAdapter


class SourceAddressRequests(object):
    def __init__(self):
        self.session = requests.session()
        self.ips = []

    @staticmethod
	def get_local_ips():
	    """获取本机所有ip"""
	    local_ips = []
	    info = psutil.net_if_addrs()
	    for k, v in info.items():
	        if "eth" in k:
	            for item in v:
	                if item[0] == 2:
	                    local_ips.append(item[1])
	    # # 去掉原始ip
	    # local_ips = local_ips[1:]
	    print("本机ip数量:", len(local_ips), local_ips)
	    return local_ips

    def adapter_requests(self):
        """随机绑定一个本机ip"""
        bind_address = random.choice(self.ips)
        print("请求ip:", bind_address)
        new_source = SourceAddressAdapter(bind_address)
        self.session.mount('http://', new_source)
        self.session.mount('https://', new_source)

    def test_requests(self):
        """测试请求"""
        url = "http://httpbin.org/get"
        response = self.session.get(url=url)
        origin = response.json()["origin"]
        print("检测到ip:", origin)

    def main(self):
        self.ips = self.get_local_ips()
        for i in range(5):
            print("第{}次请求".format(i + 1))
            self.adapter_requests()
            self.test_requests()


if __name__ == '__main__':
    test = SourceAddressRequests()
    test.main()

测试结果为:

ip地址已经做处理,请自行测试。

本机ip数量: 2561次请求
请求ip: 100.100.100.72
检测到ip: 100.100.100.722次请求
请求ip: 100.100.100.52
检测到ip: 100.100.100.523次请求
请求ip: 100.100.100.51
检测到ip: 100.100.100.514次请求
请求ip: 100.100.100.166
检测到ip: 100.100.100.1665次请求
请求ip: 100.100.100.75
检测到ip: 100.100.100.75

4、scrapy

创建一个测试的scrapy项目:demo。

在middlewares.py中添加自定义中间件

class BindAddressMiddleware(object):
    """随机获取本机ip,发送请求"""
    def __init__(self, settings):
        self.is_bind_address = settings.get('IS_MORE_NETWORK_CARDS')
        self.ips = settings.get('BIND_ADDRESS')

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings)

    def process_request(self, request, spider):
        if self.is_bind_address:
            bind_address = random.choice(self.ips)
            if bind_address:
                request.meta['bindaddress'] = (bind_address, 0)
                spider.logger.info('Using: %s as bind address' % bind_address)
        return None

在settings中配置参数

    # 设置启用本地网卡ip
    "IS_MORE_NETWORK_CARDS": True,
    # 获取本机所有ip
    "BIND_ADDRESS": get_local_ips(),

5、scrapy测试

在spider中进行测试

import scrapy
import json


class BinSpider(scrapy.Spider):
    name = 'bin'
    allowed_domains = ['httpbin.org']
    start_urls = ['http://httpbin.org/get'] * 5

    def parse(self, response):
        origin = json.loads(response.text)["origin"]
        print("origin is", origin)

测试结果:

...
2020-11-12 16:41:56 [bin] INFO: Using: 100.100.100.190 as bind address
2020-11-12 16:41:56 [bin] INFO: Using: 100.100.100.151 as bind address
2020-11-12 16:41:56 [bin] INFO: Using: 100.100.100.34 as bind address
2020-11-12 16:41:56 [bin] INFO: Using: 100.100.100.140 as bind address
2020-11-12 16:41:56 [bin] INFO: Using: 100.100.100.79 as bind address
origin is 100.100.100.190
origin is 100.100.100.79
origin is 100.100.100.140
origin is 100.100.100.151
origin is 100.100.100.34
...

效果好像还可以,后续自由发挥。

最后

有任何问题请留言,谢谢。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值