文章摘要:

常用代理有:

1、购买的动态IP隧道:比如阿布云动态隧道,请求不返回IP,代理访问请求,返回请求值;

2、私密代理IP:即为能够拿到返回的具体IP值(有时间限制),然后我们再用拿到的代理IP构造代理池,然后发起请求;

3、自己通过抓取免费代理IP,构造自己的IP代理池,有兴趣请移步:https://blog.csdn.net/Owen_goodman/article/details/100074822

常见代理使用场景:

1、requests脚本:get/post请求

2、scrapy:get/post 请求,在中间件添加代理

3、自动化脚本:selenium+webdriver+代理

详细介绍:

一、在requests库中代理的使用

  • 阿布云动态隧道
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
}
# 这里是阿布云服务器
# 代理服务器
proxyHost = "http-dyn.abuyun.com"
proxyPort = "9020"
# 代理隧道验证信息
proxyUser = "****"  # 你的通行证书
proxyPass = "****"  # 你的通行秘钥
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {"host": proxyHost,"port": proxyPort,"user": proxyUser,"pass": proxyPass,
}
proxies = {"http": proxyMeta,"https": proxyMeta,
}
time.sleep(0.1)
url = 'baidu.com'# get请求使用阿布云
response = requests.get(url=url, proxies=proxies, headers=headers)# post请求使用方法雷同
data={}
response = requests.post(url=url, proxies=proxies, headers=headers, data=data)
  • 私密代理IP(个人使用的蜻蜓代理)
class dandd():def spider(self):# 以 Python3 为例,其他编程语言也类似,仅需发送 HTTP GET 请求接口即可import requests# 点击上面的生成按钮生成的接口地址targetUrl = "***" # 你的接口地址resp = requests.get(targetUrl)print(resp.status_code)print(resp.text)# 这里是 蜻蜓代理with open("./ip.txt", "w+") as f:iplist = f.readlines()ipList = iplist[0::2]self.count = len(ipList)ip = random.choice(ipList)proxies = {"http": 'http://' + ip.replace("\n", "")}headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",}url = 'baidu.com'res = requests.get(url=url, proxies=proxies, headers=headers)res = requests.post(url=url, proxies=proxies, headers=headers)if __name__ == '__main__':d1 = dandd()d1.spider()

二、在scrapy框架中代理的使用

  • 重写requests方法
from requests import Requestdef start_requests(self, *args):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",}url = 'baidu.com'proxies = {"http": 'http://' + ip.replace("\n", "")} # 见上面# post请求同理request = Request(url, callback=self.parse, dont_filter=True,headers=headers, meta={'proxy': proxies})# time.sleep(0.5)yield request
  • 在中间件DOWNLOAD添加代理
# 这里是阿布云代理
# 代理服务器
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddlewareproxyServer = "http://http-dyn.abuyun.com:9020"
# 代理隧道验证信息
proxyUser = "****"
proxyPass = "****"'''
# for Python2
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)'''
# for Python3
proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")class ProxyMiddleware(object):# 将原本的process_request(self,request,spider)注释掉# 第一种def process_request(self, request, spider):request.meta["proxy"] = proxyServerprint('使用代理服务器')request.headers["Proxy-Authorization"] = proxyAuth# 第二种# 通过制定spider名字,可以指定对特定脚本使用代理     def process_request(self, request, spider):if spider.name in ["name1", "name2", "name3"]:request.meta["proxy"] = proxyServerrequest.headers["Proxy-Authorization"] = proxyAuth
# 这里是蜻蜓代理
# 下面示例是写在中间件里,然后在settings里开启这个中间件
class qingTingMiddleware(object):# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the downloader middleware does not modify the# passed objects.num = 1  #count = 0  # 统计所有的ip个数index = 0  # 取第几个ipnow = 0def getIP(self):  # 获取一个ipif self.count - 1 == self.index or self.index == 0:  # 取完所有IP,或者第一次取IPpre = self.nowself.now = time.time()if int((self.now - pre)) < 6:time.sleep(6 - int((self.now - pre)))self.now = time.time()print("重新调用IP")getAllIp = "your api"es = requests.get(url=getAllIp)res.encoding = "utf-8"with open("./ip.txt", "w") as f:f.write(res.text)if self.index != 0:self.index = 0ip = re.findall(r'(\d+\.\d+\.\d+\.\d+:\d+)', res.text)[self.index] self.index += 1else:with open("./ip.txt", "r") as f:iplist = f.readlines()ipList = iplist[0::2]self.count = len(ipList)ip = ipList[self.index]self.index += 1return 'http://' + ip.replace("\n", "")@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return s# 将原本的process_request(self,request,spider)注释掉# 第一种def process_request(self, request, spider):ip = self.getIp()request.meta['proxy'] = ip# 第二种def process_request(self, request, spider):if spider.name in ["name1", "name2", "name3"]:ip = self.getIp()request.meta['proxy'] = ipelse:return None# def process_request(self, request, spider):#     # Called for each request that goes through the downloader#     # middleware.##     # Must either:#     # - return None: continue processing this request#     # - or return a Response object#     # - or return a Request object#     # - or raise IgnoreRequest: process_exception() methods of#     #   installed downloader middleware will be called#     return Nonedef process_response(self, request, response, spider):# Called with the response returned from the downloader.# Must either;# - return a Response object# - return a Request object# - or raise IgnoreRequestreturn responsedef process_exception(self, request, exception, spider):# Called when a download handler or a process_request()# (from other downloader middleware) raises an exception.# Must either:# - return None: continue processing this exception# - return a Response object: stops process_exception() chain# - return a Request object: stops process_exception() chain# #####2020-05-26添加的重试机制,导致断开十几分钟都连着,费时# if isinstance(exception,TimeoutError):#     return requestpassdef spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)

三、自动化工具selenium

  • 直接放在中间件中
  • 写在请求中
    def parse(self, response):url = "http://.aspx"chrome_options = Options()# proxies = random.choice([#     "116.239.105.250:40049",#     "117.26.88.235:23525",#     "60.182.178.192:30221",#     "123.163.184.232:43565",#     "113.120.62.57:43358",#     "1.199.187.37:41380",#     "117.87.139.65:49842",#     "113.128.26.228:31984",#     "125.117.146.134:48840",#     "113.120.63.82:42216",# ])# 设置代理chrome_options.add_argument('--proxy-server=%s' % proxies)# chrome_options.add_argument('--headless')  # 无头模式chrome_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bugchrome_options.add_argument('--no-sandbox')  # 以最高权限运行chrome_options.add_argument("--test-type")chrome_options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')driver = webdriver.Chrome(chrome_options=chrome_options)driver.get(url)page = driver.page_sourceres = etree.HTML(page)  # 是将HTML转化为二进制/html 格式

Python中常见的添加IP代理简单介绍相关推荐

  1. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  2. python 中常见的面试练习题

    python 中常见的面试题 语言特性 编码规范 数据类型-字符串 数据类型 - 列表 数据类型 - 字典 数据类型 - 综合 操作类题目 高级特性 正则表达式 其他内容 算法和数据结构 爬虫类 网络 ...

  3. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  4. Python 中常见的配置文件写法

    相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问,为什么要写配置文件呢?在开发过程中,我们常常会用到一些固定参数或者是常量.对于这些较为固定且常用到的部分,往往会将其写到一个固定 ...

  5. Python中常见的配置文件写法分享!

    相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问,为什么要写配置文件呢?在开发过程中,我们常常会用到一些固定参数或者是常量.对于这些较为固定且常用到的部分,往往会将其写到一个固定 ...

  6. Python中常见的__init__.py是什么意思?详解Python import的方式和原理

    Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...

  7. 爬虫中的User-Agent和IP代理

    爬虫中的User-Agent和IP代理 一.User-Agent 按照百度百科的解释:User-Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本 ...

  8. Python中常见的关键字

    Python中常见的关键字 什么是关键字 简单的我们可以把关键字看作古代朝廷的官衔,每一个当官的人可能不一样,但每一个官衔都对应着不同的职位,不同的职责. Python内部自带的用于处理业务逻辑的特殊 ...

  9. python如何基于redis实现ip代理池

    这篇文章主要介绍了python如何基于redis实现ip代理池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用apscheduler库定时爬取i ...

最新文章

  1. 情感分析:基于卷积神经网络
  2. 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
  3. linux中传输文件方法,Linux快速传输文件几种方法
  4. 理解 Keystone 核心概念 - 每天5分钟玩转 OpenStack(18)
  5. C#服务器编程:WebService、Ajax与回调函数(一)
  6. dp 树状数组 逆序元组
  7. WildFly Swarm:使用Java EE构建微服务
  8. .net一个函数要用另一个函数的值_VLOOKUP函数
  9. c hello world
  10. u-boot工作流程
  11. 手撕Vue-Router
  12. Django框架详细介绍---认证系统
  13. 小贝拉机器人是朋友_被Angelababy、周震南等摸头杀?机器人贝拉凭什么受宠
  14. mdui.js手机端侧边滑出导航菜单
  15. 可编程、变频调速与触摸屏实验实训装置
  16. 【selenium】126官网邮箱登录
  17. Js 把html字符串显示,js Html结构转字符串形式显示代码
  18. LGP970刷机心得
  19. 直接下载:Windows 10正式版官方原版镜像!
  20. 网站快照被劫持,网站被劫持跳转另一个网站解决办法

热门文章

  1. 智能产品的“情感交互”
  2. 【mybatis】mybatis的特性和优势
  3. 一名软件工程师实习生的创业公司体验
  4. Python是机器学习的“最佳语言”的N大证据
  5. 线段树 java_线段树合并:从入门到放弃(示例代码)
  6. 【第十七届智能车】智能车图像处理(4)-元素识别(三岔)
  7. 解决gnuplot中'Terminal type set to 'unknown'不能显示绘图的问题
  8. Android禁止自动同步网络时间
  9. python zipfile压缩使用说明
  10. C#中控制键盘只输入数字,退格