摘要: Requests 和 Scrapy 中的代理 IP 设置方法。

目标测试网页如下,请求该网页可以返回当前 IP 地址:

∞ http://icanhazip.com

先来说说 Requests 中如何设置代理 IP。

▌不使用代理

先来看一下不使用代理 IP 的情况:

import requests
url = 'http://icanhazip.com'
try:response = requests.get(url) #不使用代理print(response.status_code)if response.status_code == 200:print(response.text)
except requests.ConnectionError as e:print(e.args)

运行上面的程序,会返回我们电脑本机的 IP,可以通过百度查询 IP 地址对比一下就知道了。

200
124.238.223.xxx # 后三位隐去了
[Finished in 0.8s]

▌使用代理

然后我们测试一下使用代理后的情况。

常见的代理包括 HTTP 代理和 SOCKS5 代理,前者可以找一些免费代理 IP 进行测试,由于我电脑上使用的是 Shadowsocks,所以就介绍一下 SOCKS5 代理的设置。

启动该软件后默认会在 1080 端口下创建 SOCKS5 代理服务,代理为:127.0.0.1:1080,然后我们在 Requests 中使用该代理,方法很简单只需要添加一项 proxies 参数即可:

proxies = [{'http':'socks5://127.0.0.1:1080'},{'https':'socks5://127.0.0.1:1080'}
]
proxies = random.choice(proxies)
print(proxies)
url = 'http://icanhazip.com'
try:response = requests.get(url,proxies=proxies) #使用代理print(response.status_code)if response.status_code == 200:print(response.text)
except requests.ConnectionError as e:print(e.args)

这里,proxies 参数是字典类型,键名'http' 表示协议类型,键值 'socks5://127.0.0.1:1080'表示代理,这里添加了 http 和 https 两个代理,这样写是因为有些网页采用 http 协议,有的则是采用 https 协议,为了在这两类网页上都能顺利使用代理,所以一般都同时写上,当然,如果确定了某网页的请求类型,可以只写一种,比如这里我们请求的 url 使用的是 http 协议,那么使用 http 代理就可以,random 函数用来随机选择一个代理,我们来看一下结果:

{'http': 'socks5://127.0.0.1:1080'}
200
45.78.42.xxx #xxx表示隐去了部分信息

可以看到,这里随机选择了 http 协议的代理后,返回的 IP 就是我真实的 IP 代理地址,成功代理后就可以爬一些墙外的网页了。

延伸一下,假如随机选择的是 https 代理,那么返回的 IP 结果还一样么?我们尝试重复运行一下上面的程序:

{'https': 'socks5://127.0.0.1:1080'}
200
124.238.223.xxx

可以看到这次使用了 https 代理,返回的 IP 却是本机的真实 IP,也就是说代理没有起作用。

进一步地,我们将 url 改为 https 协议 'https://icanhazip.com',然后再尝试分别用 http 和 https 代理请求,查看一下结果:

#http 请求
{'http': 'socks5://127.0.0.1:1080'}
200
124.238.223.xxx
#https 请求
{'https': 'socks5://127.0.0.1:1080'}
200
45.78.42.xxx

可以看到,两种请求的结果和之前的刚好相反了,由于 url 采用了 https 协议,则起作用的是 https 代理,而 http 代理则不起作用了,所以显示的是本机 IP。

因此,可以得到这样的一个结论:

HTTP 代理,只代理 HTTP 网站,对于 HTTPS 的网站不起作用,也就是说,用的是本机 IP。

HTTPS 代理则同理。

▌使用付费代理

上面,我们只使用了一个代理,而在爬虫中往往需要使用多个代理,那有如何构造呢,这里主要两种方法:

  1. 一种是使用免费的多个 IP;
  2. 一种是使用付费的 IP 代理;

免费的 IP 往往效果不好,那么可以搭建 IP 代理池,但对新手来说搞一个 IP 代理池成本太高,如果只是个人平时玩玩爬虫,完全可以考虑付费 IP,几块钱买个几小时动态 IP,多数情况下都足够爬一个网站了。

这里推荐一个付费代理「阿布云代理」,效果好也不贵,如果你不想费劲地去搞 IP 代理池,那不妨花几块钱轻松解决。

首次使用的话,可以选择购买一个小时的动态版试用下,点击生成隧道代理信息作为凭证加入到代码中。

将信息复制到官方提供的 Requests 代码中,运行来查看一下代理 IP 的效果:

import requests
# 待测试目标网页
targetUrl = "http://icanhazip.com"
def get_proxies():# 代理服务器proxyHost = "http-dyn.abuyun.com"proxyPort = "9020"# 代理隧道验证信息proxyUser = "H8147158822SW5CD"proxyPass = "CBE9D1D21DC94189"proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {"host" : proxyHost,"port" : proxyPort,"user" : proxyUser,"pass" : proxyPass,}proxies = {"http"  : proxyMeta,"https" : proxyMeta,}for i in range(1,6):resp = requests.get(targetUrl, proxies=proxies)# print(resp.status_code)print('第%s次请求的IP为:%s'%(i,resp.text))
get_proxies()

可以看到每次请求都会使用不同的 IP,是不是很简单?比搞 IP 代理池省事多了。

第1次请求的IP为:125.117.134.158第2次请求的IP为:49.71.117.45第3次请求的IP为:112.244.117.94第4次请求的IP为:122.239.164.35第5次请求的IP为:125.106.147.24[Finished in 2.8s]

当然,还可以这样设置:

"""
project = 'Code', file_name = 'lession', author = 'AI悦创'
time = '2020/5/26 10:36', product_name = PyCharm, 公众号:AI悦创
code is far away from bugs with the god animal protectingI love animals. They taste delicious.
"""
import requests
# 112.48.28.233
url = 'http://icanhazip.com'
# 下面的 try:......except:......是一个防错机制
# username:password@代理服务器ip地址:port
proxy = {'http':'http://H8147158822SW5CD:CBE9D1D21DC94189@http-dyn.abuyun.com:9020'}
try:response = requests.get(url, proxies = proxy)print(response.status_code)if response.status_code == 200:print(response.text)
except requests.ConnectionError as e:# 如果报错,则输出报错信息print(e.args)

以上,介绍了 Requests 中设置代理 IP 的方法,下面我们接着介绍在 Scrapy 中如何设置。

▌middlewares.py 中设置

这种方法需要先在 middlewares.py 中设置代理 IP 中间件:

import random
class ProxyMiddleware(object):def __init__(self, ip):self.ip = ip@classmethoddef from_crawler(cls, crawler):return cls(ip=crawler.settings.get('PROXIES'))def process_request(self, request, spider):ip = random.choice(self.ip)request.meta['proxy'] = iplogging.debug('Using Proxy:%s'%ip)

接着,需要在 settings.py 添加几个在西刺上找的代理 IP,格式如下:

PROXIES = ['https://127.0.0.1:8112', 'https://119.101.112.176:9999','https://119.101.115.53:9999','https://119.101.117.226:9999']

然后,我们仍然以 "http://icanhazip.com" 为目标网页,运行 Scrapy 项目重复请求 5 次,查看一下每次返回的 IP 情况:

def start_requests(self):items = []for i in range(1,6):item = yield scrapy.Request(self.cate_url,callback=self.get_category)items.append(item)return itemsdef get_category(self, response):print(response.text)

结果如下:

可以看到部分 IP 成功请求得到了相应,部分 IP 则无效请求失败,因为这几个 IP 是免费的 IP,所有失效很正常。

▌使用付费代理

接下来我们使用阿布云付费代理,继续尝试一下,在 middlewares.py 中添加下面的代码:

""" 阿布云ip代理配置,包括账号密码 """
# 阿布云scrapy 写法
import base64
proxyServer = "http://http-dyn.abuyun.com:9020"
proxyUser = "HS77K12Q77V4G9MD"  # 购买后点击生成获得
proxyPass = "4131FFDFCE27F104"  # 购买后点击生成获得
# for Python3
proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")
class AbuyunProxyMiddleware(object):""" 阿布云ip代理配置 """def process_request(self, request, spider):request.meta["proxy"] = proxyServerrequest.headers["Proxy-Authorization"] = proxyAuthlogging.debug('Using Proxy:%s'%proxyServer)

由于,在阿布云购买的是最基础的代理,即每秒 5 个请求,因为 Scrapy 默认的并发数是 16 个,所以需要对 Scrapy 请求数量进行一下限制,可以设置每个请求的延迟时间为 0.2s ,这样一秒就刚好请求 5 个,最后启用上面的代理中间件类即可:

""" 启用限速设置 """
AUTOTHROTTLE_ENABLED = True
DOWNLOAD_DELAY = 0.2  # 每次请求间隔时间
DOWNLOADER_MIDDLEWARES = {#'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, #启用随机UA#'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 100,  #启用随机UA'wandoujia.middlewares.AbuyunProxyMiddleware': 200, # 启用阿布云代理#value值越小优先级越高
}

然后同样地请求 5 次,查看每次请求返回的 IP :

可以看到,每个 IP 都顺利请求成功了,所以说付费地效果还是好。

▌使用 scrapy-proxies 库代理

除了上述两种方法,我们还可以使用 GitHub 上的一个 IP 代理库:scrapy-proxies,库的使用方法很简单, 三个步骤就可以开启代理 IP。

首先,运行下面命令安装好这个库:

pip install scrapy_proxies

然后,在 Scrapy 项目中的 settings.py 文件中,添加下面一段代码:

RETRY_TIMES = 3 # 自定义请求失败重试次数
#重试的包含的错误请求代码
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,'scrapy_proxies.RandomProxy': 100,'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
PROXY_LIST = r'/proxies.txt'  # proxy 代理文件存放位置,此处为程序所在磁盘根目录下
PROXY_MODE = 0 # 每次请求都使用不同的代理

最后,需要提供多个代理 IP,我们在西刺上随便找几个 IP,然后存放在 PROXY_LIST 指定的 txt 文件中即可,格式如下:

https://119.101.112.176:9999
https://119.101.115.53:9999
https://119.101.117.53:999

然后重复之前的操作,查看代理 IP 的设置效果。

我在使用该库的过程中,发现有一些问题,不知道是配置不对还是怎么回事,效果不是太好,所以推荐使用前两种方法。

好,以上就是在 Requests 和 Scrapy 中使用代理 IP 的方法总结,如果爬虫项目不大、追求稳定且不差钱的话,建议直接上付费代理。

Requests 和 Scrapy 中的代理 IP 设置相关推荐

  1. 【python爬虫】在scrapy中利用代理IP(爬取BOSS直聘网)

    同学们好,我又滚回来更新了,这一次我们要爬取的目标是BOSS直聘,BOSS直聘可以说是反爬虫一个很好的例子了,主要在于如果你访问他的次数过多,他就会出现验证码,要求你通过验证才能继续看,这样还算可以, ...

  2. 关于python爬虫代理ip设置proxies的问题

    本人在学习爬虫的过程中学习如何设置代理ip,但是遇到了request请求中proxies参数编写的问题 首先必须知道proxies参数是一个字典类型 proxies={ 'http': 'http:/ ...

  3. 火狐浏览器走局域网中的代理ip

    在访问某些网站时,有时下载某些文件,会提示一个ip仅可一天下载一次,这时可以走代理ip 需求,你的局域网内有可以走代理ip的配置 1:打开设置 2:打开网络设置 3:手动输入局域网中的代理ip

  4. requests模块proxies代理IP设置无效问题的解决

    学python踩了很多坑,从本站好多文章里学了好多,解决了好多坑,今天又解决了一个,感觉因该记录下来. 感谢:这位博主 援引:(Python)python3.7以后requests模块proxy(代理 ...

  5. Scrapy爬虫:代理IP配置

    Scrapy设置代理IP步骤: 1.在Scrapy工程下新建"middlewares.py": import base64 # Start your middleware clas ...

  6. requests模块基本使用、代理ip、session访问

    python原生基于网络请求的模块,比urllib更实用 相比urllib优势 自动处理编码 自动处理post请求参数.并转码 简化cookie和代理操作 安装使用 pip install reque ...

  7. Scrapy中的get_project_settings 读取设置文件

    1.引入from scrapy.utils.project import get_project_settings 2.利用get_project_settings()读取settings.py中的属 ...

  8. scrapy中使用代理cookies user-agent

    在(属于下载中间件)中间件中定义 class UserAgentMiddleware(): def init(): self.useragents=[ ] def process_request(se ...

  9. 在Scrapy中使用爬虫动态代理IP

    本文介绍如何在Scrapy中使用无忧代理(www.data5u.com)的爬虫动态代理IP,以及如何设置User-Agent. 动态转发参考https://blog.csdn.net/u0109787 ...

最新文章

  1. HDU 5510 Bazinga 暴力匹配加剪枝
  2. Dijstra算法-------为了纪念,等以后看的时候方便
  3. 用JavaScript获取输入的特殊字符
  4. sqlserve 热备用状态更新_什么是核心交换机的链路聚合、冗余、堆叠、热备份
  5. android device id修改器,修改硬盘ID硬盘序列号工具(Serial Number Changer)
  6. Docker容器解决没有Vim命令
  7. 大楼通信综合布线系统_综合布线系统设计方案时需要注意的事项
  8. C++ 找朋友(friends)
  9. wine linux 目录,linux下wine安装
  10. 即时通信软件实现原理
  11. Win10系统异常应该怎么修复
  12. 职称计算机 2007 还是2003,职称计算机考试, PPT2003和2007 区别大吗?哪个版本更容易。...
  13. 《京东话费充值系统架构演进实践》--阅读
  14. 用Java实现I am a student逆序输出为student a am I,不借助split方法和StringBuffer!
  15. 初二因式分解奥数竞赛题_八年级数学因式分解进阶练习题含答案
  16. 深度解析,抖音玩具测评短视频内容制作流程,步骤技巧分享
  17. C语言求1到20的阶乘之和
  18. Energy 收购 VDD Tech
  19. 佳能IP1180/1880/2580打印机费墨清零方法
  20. 国科大学习资料--模式识别与机器学习(黄庆明)--2018期末考试题(含答案)

热门文章

  1. 值得学习的C语言开源项目
  2. 前端开发介绍(包含调试什么的)
  3. Centos7配置代理Squid
  4. 非标自动化及电子测试夹具(FCT)类常用Ubuntu指令总结
  5. [java]判断一个数字中是否含有某个数字
  6. 计算机等级保护2.0标准,等级保护2.0基本要求-二级三级对比表
  7. 电子计算机的基本结构基于存储程序思想是由,计算机应用基础复习题
  8. php 操作sqlite
  9. 宝马ETK数据提取导出MySQL
  10. 2020 物联网架构成长之路-物联网架构小结