网络爬虫之scrapy框架设置代理

前戏

os.environ()简介

os.environ()可以获取到当前进程的环境变量,注意,是当前进程。

如果我们在一个程序中设置了环境变量,另一个程序是无法获取设置的那个变量的。

环境变量是以一个字典的形式存在的,可以用字典的方法来取值或者设置值。

os.environ() key字段详解

windows:

os.environ['HOMEPATH']:当前用户主目录。
os.environ['TEMP']:临时目录路径。
os.environ[PATHEXT']:可执行文件。
os.environ['SYSTEMROOT']:系统主目录。
os.environ['LOGONSERVER']:机器名。
os.environ['PROMPT']:设置提示符。

linux:

os.environ['USER']:当前使用用户。
os.environ['LC_COLLATE']:路径扩展的结果排序时的字母顺序。
os.environ['SHELL']:使用shell的类型。
os.environ['LAN']:使用的语言。
os.environ['SSH_AUTH_SOCK']:ssh的执行路径。

内置的方式

原理

scrapy框架内部已经实现了设置代理的方法,它的原理是从环境变量中取出设置的代理,然后再使用,

所以我们只需要在程序执行前将代理以键值对的方式设置到环境变量中即可。

代码

第一种方式:直接添加键值对的方式

class ChoutiSpider(scrapy.Spider):
	name = 'chouti'
	allowed_domains = ['chouti.com']
	start_urls = ['https://dig.chouti.com/']
	cookie_dict = {}

	def start_requests(self):
		import os
		os.environ['HTTPS_PROXY'] = "http://username:password@192.168.11.11:9999/"
		os.environ['HTTP_PROXY'] = '19.11.2.32',
		for url in self.start_urls:
			yield Request(url=url,callback=self.parse)

第二种方式:设置meta参数的方式

class ChoutiSpider(scrapy.Spider):
	name = 'chouti'
	allowed_domains = ['chouti.com']
	start_urls = ['https://dig.chouti.com/']
	cookie_dict = {}

	def start_requests(self):
		for url in self.start_urls:
			yield Request(url=url,callback=self.parse,meta={'proxy':'"http://username:password@192.168.11.11:9999/"'})

自定义方式

原理

我们可以根据内部实现的添加代理的类(中间件)的实现方法,来对它进行升级,比如内部的方式一次只能使用一个代理,

我们可以弄一个列表,装很多代理地址,然后随机选取一个代理,这样可以防止请求过多被封ip

代码

class ChoutiSpider(scrapy.Spider):
	name = 'chouti'
	allowed_domains = ['chouti.com']
	start_urls = ['https://dig.chouti.com/']
	cookie_dict = {}

	def start_requests(self):
		for url in self.start_urls:
			yield Request(url=url,callback=self.parse,meta={'proxy':'"http://username:password@192.168.11.11:9999/"'})

			import base64
			import random
			from six.moves.urllib.parse import unquote
			try:
				from urllib2 import _parse_proxy
			except ImportError:
				from urllib.request import _parse_proxy
			from six.moves.urllib.parse import urlunparse
			from scrapy.utils.python import to_bytes

			class XXProxyMiddleware(object):

				def _basic_auth_header(self, username, password):
					user_pass = to_bytes(
						'%s:%s' % (unquote(username), unquote(password)),
						encoding='latin-1')
					return base64.b64encode(user_pass).strip()

				def process_request(self, request, spider):
					PROXIES = [
						"http://username:password@192.168.11.11:9999/",
						"http://username:password@192.168.11.12:9999/",
						"http://username:password@192.168.11.13:9999/",
						"http://username:password@192.168.11.14:9999/",
						"http://username:password@192.168.11.15:9999/",
						"http://username:password@192.168.11.16:9999/",
					]
					url = random.choice(PROXIES)

					orig_type = ""
					proxy_type, user, password, hostport = _parse_proxy(url)
					proxy_url = urlunparse((proxy_type or orig_type, hostport, '', '', '', ''))

					if user:
						creds = self._basic_auth_header(user, password)
					else:
						creds = None
					request.meta['proxy'] = proxy_url
					if creds:
						request.headers['Proxy-Authorization'] = b'Basic ' + creds

写完类之后需要在settings文件里配置一下:

DOWNLOADER_MIDDLEWARES = {
   'spider.xxx.XXXProxyMiddleware': 543,
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏weixuqin 的专栏

使用代理爬取微信文章

3817
来自专栏张善友的专栏

利用Windows性能计数器(PerformanceCounter)监控

一、概述 性能监视,是Windows NT提供的一种系统功能。Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种...

3199
来自专栏枕边书

从并发处理谈PHP进程间通信(一)外部介质

进程间通信 进程间通信(IPC,Inter-Process Communication),多进程开发中,进程间通信是一个永远也绕不开的问题。在 web开发中,我...

2796
来自专栏机器学习算法与Python学习

Python之运行实现原理

来源:@mozillazg 链接:https://mozillazg.com/2016/04/apm-python-agent-principle.html 本...

36214
来自专栏古时的风筝

mybatis Generator生成代码及使用方式

为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,ORM 的出现就是为了简化开发。最初的开发方式是业务逻辑和数据库查询逻辑是分开的,...

2389
来自专栏以南小隐-数通那些事儿

Nginx1.8.1开启防盗链

1212
来自专栏向治洪

Android热插拔事件处理详解

一、Android热插拔事件处理流程图 Android热插拔事件处理流程如下图所示: ? 二、组成 1. NetlinkManager:       ...

7727
来自专栏Java3y

Hibernate面试题大全

Hibernate常见面试题 Hibernate工作原理及为什么要用? Hibernate工作原理及为什么要用? 读取并解析配置文件 读取并解析映射信息,创建...

3925
来自专栏智能算法

Python学习(九)---- python中的线程

原文地址: https://blog.csdn.net/fgf00/article/details/52773459 编辑:智能算法,欢迎关注! 上期我们一起学...

1572
来自专栏蓝天

Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,...

1401

扫码关注云+社区

领取腾讯云代金券