动态更改IP地址?

64

考虑这种情况,我想经常爬取网站,但是在一些天数/限制后我的IP地址被屏蔽了。

那么,我该如何动态更改我的IP地址或者有什么其他的想法呢?

6个回答

53

使用Scrapy的方法将利用两个组件,RandomProxyRotateUserAgentMiddleware

按照以下方式修改DOWNLOADER_MIDDLEWARES。您需要在settings.py中插入新组件:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 90,
    'tutorial.randomproxy.RandomProxy': 100,
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
    'tutorial.spiders.rotate_useragent.RotateUserAgentMiddleware' :400,    
}

随机代理

您可以使用scrapy-proxies组件。该组件会从列表中随机选择一个代理,以避免IP封禁并提高爬取速度。

您可以通过快速的互联网搜索来构建您的代理列表。根据请求的URL格式,将链接复制到list.txt文件中。

用户代理轮换

对于每个Scrapy请求,将使用您预先定义的列表中的随机用户代理:

class RotateUserAgentMiddleware(UserAgentMiddleware):
    def __init__(self, user_agent=''):
        self.user_agent = user_agent

    def process_request(self, request, spider):
        ua = random.choice(self.user_agent_list)
        if ua:
            request.headers.setdefault('User-Agent', ua)

            # Add desired logging message here.
            spider.log(
                u'User-Agent: {} {}'.format(request.headers.get('User-Agent'), request),
                level=log.DEBUG
            )

    # the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape
    # for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php
    user_agent_list = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]

更多细节 在这里


感谢您提供的解决方案,帮助了我很多。您可以详细说明一下DOWNLOADER_MIDDLEWARES在这里的作用吗?@aberna - Jack Daniel
在RotateUserAgentMiddleware中,每个爬虫只分配一个useragent,即我正在使用递归调用进行爬取,对于每个调用,我都想更改User-Agent,但是上面的代码并没有实现。请帮帮我。 - Jack Daniel
2
如何获取代理列表?有人知道吗?请帮忙。 - The Gr8 Adakron
你尝试过在谷歌上搜索“免费代理列表”吗? - aberna

17

您可以尝试使用代理服务器来防止被封锁。有一些提供有效代理的服务。我尝试过最好的是https://gimmeproxy.com,他们经常检查各种参数的代理。

为了从他们那里获取代理,您只需要进行以下请求:

https://gimmeproxy.com/api/getProxy

他们将提供包含所有代理数据的JSON响应,您可以随后根据需要使用:

{
  "supportsHttps": true,
  "protocol": "socks5",
  "ip": "179.162.22.82",
  "port": "36915",
  "get": true,
  "post": true,
  "cookies": true,
  "referer": true,
  "user-agent": true,
  "anonymityLevel": 1,
  "websites": {
    "example": true,
    "google": false,
    "amazon": true
  },
  "country": "BR",
  "tsChecked": 1517952910,
  "curl": "socks5://179.162.22.82:36915",
  "ipPort": "179.162.22.82:36915",
  "type": "socks5",
  "speed": 37.78,
  "otherProtocols": {}
}

您可以使用Curl像这样使用它:

curl -x socks5://179.162.22.82:36915 http://example.com

7
如果您正在使用R语言,可以通过TOR进行网络爬虫。我认为TOR每10分钟自动重置其IP地址。我认为有一种方法可以强制TOR在较短的时间间隔内更改IP,但这对我无效。相反,您可以设置多个TOR实例,然后在独立的实例之间切换(您可以在此处找到如何设置多个TOR实例的好解释:https://tor.stackexchange.com/questions/2006/how-to-run-multiple-tor-browsers-with-different-ips)。
之后,在R中可以执行以下操作(使用独立TOR浏览器的端口和用户代理列表。每次调用“getURL”函数时循环遍历您的端口/用户代理列表)。
library(RCurl)

port <- c(a list of your ports)
proxy <- paste("socks5h://127.0.0.1:",port,sep="")
ua <- c(a list of your useragents)

opt <- list(proxy=sample(proxy,1),
            useragent=sample(ua,1),
            followlocation=TRUE,
            referer="",
            timeout=timeout,
            verbose=verbose,
            ssl.verifypeer=ssl)

webpage <- getURL(url=url,.opts=opt)

3
一些VPN应用程序允许您自动更改IP地址为一个新的随机IP地址,如每2分钟。HMA! Pro VPN和VPN4ALL软件都支持此功能。

0

有一个关于虚拟私人网络(VPN)的警告,务必仔细检查他们的条款和条件,因为使用 VPN 进行爬取违反了他们的用户政策(例如 Astrill)。我曾尝试过一款爬取工具,结果我的账户被锁定了。


-1
如果您有公共IP地址,请将它们添加到您的接口上,如果您正在使用Linux,则可以使用Iptables来切换这些公共IP地址。
两个IP地址的Iptables示例规则:
iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to-source 192.168.0.2

iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to-source 192.168.0.3

如果您有4个IP,则概率将变为0.25。
您还可以通过简单的步骤创建自己的代理。
这些规则将允许代理服务器切换其出站IP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接