前戲
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,
}
