爬蟲 - scrapy框架設置代理

前戲

os.environ()簡介

os.environ()能夠獲取到當前進程的環境變量,注意,是當前進程。python

若是咱們在一個程序中設置了環境變量,另外一個程序是沒法獲取設置的那個變量的。linux

環境變量是以一個字典的形式存在的,能夠用字典的方法來取值或者設置值。shell

os.environ() key字段詳解

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 }
相關文章
相關標籤/搜索