前言
在我們平時使用爬蟲程序采集數(shù)據(jù)時,往往會遇到简十,因采集速度過快導致的自己網(wǎng)絡ip被目標網(wǎng)站封禁檬某,這種封禁有時候是封幾分鐘,有時候是封一天螟蝙,封的時間不等恢恼,但是這樣會導致我們局域網(wǎng)內其他人也無法訪問目標網(wǎng)站,最大的問題是我們無法進行數(shù)據(jù)采集胰默。為了保證正常采集數(shù)據(jù)且本地ip不被封禁场斑,引入代理ip漓踢。
代理ip
代理ip有很多種類型,這里我們爬蟲程序一般使用的是http或https的代理ip漏隐。
爬蟲使用的話最好用高匿代理
高匿名代理不改變客戶機的請求喧半,這樣在服務器看來就像有個真正的客戶瀏覽器在訪問它,這時客戶的真實IP是隱藏的青责,服務器端不會認為我們使用了代理挺据。
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í)行get請求
線上爬蟲使用代理ip方案
目前爬蟲使用代理的方法很多,這里我簡單說說我在線上環(huán)境使用代理的心得脖隶。
首先扁耐,我自己維護了一個代理ip池,這個ip池是放在redis中的产阱,也就是說我的所有可使用的代理ip是放在redis中做葵,使用redis的set數(shù)據(jù)結構,
當然了心墅,這里列出的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增加代理的需求。