前言
在我們平時使用爬蟲程序采集數(shù)據(jù)時,往往會遇到,因采集速度過快導(dǎo)致的自己網(wǎng)絡(luò)ip被目標網(wǎng)站封禁,這種封禁有時候是封幾分鐘,有時候是封一天,封的時間不等,但是這樣會導(dǎo)致我們局域網(wǎng)內(nèi)其他人也無法訪問目標網(wǎng)站,最大的問題是我們無法進行數(shù)據(jù)采集。為了保證正常采集數(shù)據(jù)且本地ip不被封禁,引入代理ip。
代理ip
代理ip有很多種類型,這里我們爬蟲程序一般使用的是http或https的代理ip。
爬蟲使用的話最好用高匿代理
高匿名代理不改變客戶機的請求,這樣在服務(wù)器看來就像有個真正的客戶瀏覽器在訪問它,這時客戶的真實IP是隱藏的,服務(wù)器端不會認為我們使用了代理。
requests庫使用代理ip
# 準備好的代理ip
proxy = "127.0.0.1:8000"
proxies = {
"https": "https://{0}".format(proxy),
"http": "http://{0}".format(proxy),
}
res = requests.get(url, proxies=proxies)
以上代碼片段是最簡單的requests庫實現(xiàn)代理ip執(zhí)行g(shù)et請求
線上爬蟲使用代理ip方案
目前爬蟲使用代理的方法很多,這里我簡單說說我在線上環(huán)境使用代理的心得。
首先,我自己維護了一個代理ip池,這個ip池是放在redis中的,也就是說我的所有可使用的代理ip是放在redis中,使用redis的set數(shù)據(jù)結(jié)構(gòu),
當然了,這里列出的ip都是可使用的,因為在放入redis之前我會使用特定的程序去檢測代理ip的可用性。
代理ip的來源這里我要說一下,最好是越多越好,分好類,付費的,免費的,撥號的,全部拿來用,使用的時候隨機從redis中取一個出來用。代理ip的選擇大家自行查找,或者需要也可給我留言。
scrapy使用代理ip
class RandomProxyMiddleware(object):
def __init__(self):
settings = get_project_settings()
self.PROXY_REDIS_HOST = settings.get('PROXY_REDIS_HOST')
self.PROXY_REDIS_PORT = settings.get('PROXY_REDIS_PORT')
self.PROXY_REDIS_PARAMS = settings.get('PROXY_REDIS_PARAMS')
self.PROXY_REDIS_KEY = settings.get('PROXY_REDIS_KEY')
self.pool = redis.ConnectionPool(host=self.PROXY_REDIS_HOST,
port=self.PROXY_REDIS_PORT,
db=self.PROXY_REDIS_PARAMS['db'],
password=self.PROXY_REDIS_PARAMS['password'])
self.conn = redis.StrictRedis(connection_pool=self.pool)
def process_request(self, request, spider):
proxy = self.conn.srandmember(self.PROXY_REDIS_KEY)
proxy = proxy.decode('utf-8')
proxy = json.loads(proxy)
ip = proxy['proxy']
request.meta['proxy'] = "https://%s" % ip
上圖代碼片段自定義一個代理中間件RandomProxyMiddleware
,在scrapyprocess_request(self, request, spider)
這個方法中使用redis的操作隨機獲取一個代理出來,加到request.meta['proxy']
中,便完成了代理中間件的編寫。隨后把RandomProxyMiddleware
加到setting文件中,
DOWNLOADER_MIDDLEWARES = {
'crawl_spider.middlewares.RandomProxyMiddleware': 400,
}
便可完成scrapy增加代理的需求。