os.environ()能夠獲取到當前進程的環境變量,注意,是當前進程。python
若是咱們在一個程序中設置了環境變量,另外一個程序是沒法獲取設置的那個變量的。linux
環境變量是以一個字典的形式存在的,能夠用字典的方法來取值或者設置值。shell
windows:windows
1 os.environ['HOMEPATH']:當前用戶主目錄。 2 os.environ['TEMP']:臨時目錄路徑。 3 os.environ[PATHEXT']:可執行文件。 4 os.environ['SYSTEMROOT']:系統主目錄。 5 os.environ['LOGONSERVER']:機器名。 6 os.environ['PROMPT']:設置提示符。
linux:cookie
1 os.environ['USER']:當前使用用戶。 2 os.environ['LC_COLLATE']:路徑擴展的結果排序時的字母順序。 3 os.environ['SHELL']:使用shell的類型。 4 os.environ['LAN']:使用的語言。 5 os.environ['SSH_AUTH_SOCK']:ssh的執行路徑。
scrapy框架內部已經實現了設置代理的方法,它的原理是從環境變量中取出設置的代理,而後再使用,框架
因此咱們只須要在程序執行前將代理以鍵值對的方式設置到環境變量中便可。dom
第一種方式:直接添加鍵值對的方式ssh
1 class ChoutiSpider(scrapy.Spider): 2 name = 'chouti' 3 allowed_domains = ['chouti.com'] 4 start_urls = ['https://dig.chouti.com/'] 5 cookie_dict = {} 6 7 def start_requests(self): 8 import os 9 os.environ['HTTPS_PROXY'] = "http://username:password@192.168.11.11:9999/" 10 os.environ['HTTP_PROXY'] = '19.11.2.32', 11 for url in self.start_urls: 12 yield Request(url=url,callback=self.parse)
第二種方式:設置meta參數的方式scrapy
1 class ChoutiSpider(scrapy.Spider): 2 name = 'chouti' 3 allowed_domains = ['chouti.com'] 4 start_urls = ['https://dig.chouti.com/'] 5 cookie_dict = {} 6 7 def start_requests(self): 8 for url in self.start_urls: 9 yield Request(url=url,callback=self.parse,meta={'proxy':'"http://username:password@192.168.11.11:9999/"'})
咱們能夠根據內部實現的添加代理的類(中間件)的實現方法,來對它進行升級,好比內部的方式一次只能使用一個代理,ide
咱們能夠弄一個列表,裝不少代理地址,而後隨機選取一個代理,這樣能夠防止請求過多被封ip
1 class ChoutiSpider(scrapy.Spider): 2 name = 'chouti' 3 allowed_domains = ['chouti.com'] 4 start_urls = ['https://dig.chouti.com/'] 5 cookie_dict = {} 6 7 def start_requests(self): 8 for url in self.start_urls: 9 yield Request(url=url,callback=self.parse,meta={'proxy':'"http://username:password@192.168.11.11:9999/"'}) 10 11 import base64 12 import random 13 from six.moves.urllib.parse import unquote 14 try: 15 from urllib2 import _parse_proxy 16 except ImportError: 17 from urllib.request import _parse_proxy 18 from six.moves.urllib.parse import urlunparse 19 from scrapy.utils.python import to_bytes 20 21 class XXProxyMiddleware(object): 22 23 def _basic_auth_header(self, username, password): 24 user_pass = to_bytes( 25 '%s:%s' % (unquote(username), unquote(password)), 26 encoding='latin-1') 27 return base64.b64encode(user_pass).strip() 28 29 def process_request(self, request, spider): 30 PROXIES = [ 31 "http://username:password@192.168.11.11:9999/", 32 "http://username:password@192.168.11.12:9999/", 33 "http://username:password@192.168.11.13:9999/", 34 "http://username:password@192.168.11.14:9999/", 35 "http://username:password@192.168.11.15:9999/", 36 "http://username:password@192.168.11.16:9999/", 37 ] 38 url = random.choice(PROXIES) 39 40 orig_type = "" 41 proxy_type, user, password, hostport = _parse_proxy(url) 42 proxy_url = urlunparse((proxy_type or orig_type, hostport, '', '', '', '')) 43 44 if user: 45 creds = self._basic_auth_header(user, password) 46 else: 47 creds = None 48 request.meta['proxy'] = proxy_url 49 if creds: 50 request.headers['Proxy-Authorization'] = b'Basic ' + creds
寫完類以後須要在settings文件裏配置一下:
1 DOWNLOADER_MIDDLEWARES = { 2 'spider.xxx.XXXProxyMiddleware': 543, 3 }