無法直接連接互聯網,需要使用代理時(Scrapy)
在windows系統中,如果無法直接連接互聯網,需要使用代理時該怎麽做呢?
1. 在powershell中設置proxy
背景:使用公司電腦,無法直接訪問互聯網,想要訪問互聯網就得使用代理,但是在控制面板中設置代理的選項被禁用,個人又具有管理員權限的。
解決方法:
在powershell中或cmd中先運行以下命令:
1)http proxy: set http_proxy=http://host:port
2)https proxy: set https_proxy=https://host:port
2. 針對Scrapy使用代理的方法
背景:僅僅是為了使Scrapy運行中訪問互聯網時使用代理(實質上是使Scrapy中的DownloaderMiddleware部分使用代理)
解決方法:
方法一: 先在powershell中先運行1中的命令,然後再啓動Scrapy程序;
方法二: 在Scrapy中設置,僅對Scrapy生效:
1)在setting.py中啓用HttpProxyMiddleware,如下:
DOWNLOADER_MIDDLEWARES={ 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':1 }
2) 通過request.meta進行proxy:
request=Request(url="http://example.com") requests.meta['proxy']='host:port' yield request
3) 若想要隨機使用多個proxy時:
1 Class MySpider(BaseSpider): 2 name = "my_spider" 3 def __init___(self,*args,**kwargs): 4 super(MySpider,self).__init__(*args,**kwargs) 5 self.proxy_pool=['proxy_address1','proxy_address2',...,'proxy_addressN'] 6 7 def parse(self,response): 8 if something: 9 yield self.get_Request(url) 10 11 def get_request(self,url): 12 req=Request(url=url) 13 if self.proxy_pool: 14 req.meta['proxy'] = random.choice(self.proxy_pool) 15 return req
方法三:創建代理文件,專門用於設置代理
1)在scrapy project中創建文件 middlewares.py,寫入以下代碼:
1 import base64 2 class ProxyMiddleware(object): 3 #overwrite process request 4 def process_request(self,request,spider): 5 #Set the location of the proxy 6 request.meta['proxy']="http://proxy_ip:port" 7 8 #use the followig lines if your proxy requires authentication 9 proxy_user_pass="Username:Password" 10 #setup basic authentication for the proxy 11 encoded_user_pass = base64.encodestring(proxy_user_pass) 12 request.headers['Proxy-Authorization'] = 'Basic' +encoded_user_pass
2)設置setting.py
1 DOWNLOADER_MIDDLEWARES = { 2 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110, 3 'project_name.middlewares.ProxyMiddleware': 100, 4 }