爬取西刺代理IP存入本地txt檔案作為代理IP池(未加入是否可用驗證)
阿新 • • 發佈:2019-02-14
執行環境:
Python3.5.3
、Windows 10 RS4
、Pycharm 2017.2.4
前言
我們在爬取資料時,經常會因為請求太過頻繁導致反爬機制生效,不少伺服器的反爬機制是針對訪問主機IP
進行限制訪問,返回503
等HTTP狀態碼
。所以我們可以在爬蟲請求中加入代理IP
,避免出現訪問限制得問題。
在爬取電影網站時,就遇到了限制IP
的問題。所以寫了一個簡單的爬蟲程式來獲取獲取西刺代理(http://www.xicidaili.com/)
所提供的代理IP
,然後將爬取到的代理IP
儲存到本地txt
檔案中,當爬蟲程式需要用到代理IP
時,可讀取該txt
檔案中的代理IP
。
獲取代理IP
爬蟲程式
西刺代理提供的代理IP
是免費的(專業版除外,專業版是大象代理IP提供),免費的東西畢竟還是不太好用,知名博主崔慶才之前做過一篇評測,西刺代理IP
的可用率甚至低於10%
。
西刺代理的代理IP
資料是十五分鐘重新整理一次,所以為了獲得最新的代理IP
,程式中也設定為15分鐘
採集一次。除此之外,提取該頁面的代理IP
時,為了保證代理IP
的可用性,加入了以下兩個篩選條件:
- 存活時間 > 1天
- 速度快,延遲低的
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : Woolei
# @File : getProxyIP.py
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import time
# HOME_URL = 'http://www.xicidaili.com/' # 首頁代理IP
# ANONY_URL = 'http://www.xicidaili.com/nn/' # 國內高匿代理IP
# NORMAL_URL = 'http://www.xicidaili.com/nt/' # 國內普通代理IP
# HTTP_URL = 'http://www.xicidaili.com/wt/' # 國內HTTP代理IP
HTTPS_URL = 'http://www.xicidaili.com/wn/' # 國內HTTPS代理IP
HEADERS = {
'Host': 'www.xicidaili.com',
'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
def get_ip(obj):
counter = 0
sec_obj = obj.find('table')
ip_text = sec_obj.findAll('tr') # 獲取帶有IP地址的表格的所有行
if ip_text is not None:
with open('Proxy-IP.txt', 'w') as f: # 儲存到本地txt檔案中
for i in range(1, len(ip_text)):
ip_tag = ip_text[i].findAll('td')
ip_live = ip_tag[8].get_text() # 代理IP存活時間
ip_speed = ip_tag[6].find('div', {'class': 'bar_inner fast'}) # 提取出速度快的IP
if '天' in ip_live and ip_speed:
ip_port = ip_tag[1].get_text() + ':' + ip_tag[2].get_text() # 提取出IP地址和埠號
counter += 1
f.write(ip_port + '\n')
# logging.info(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + ' -- ' + 'Got %s proxy IPs.')
def start(URL):
while True:
request = Request(URL, headers=HEADERS)
response = urlopen(request)
bsObj = BeautifulSoup(response, 'lxml') # 解析獲取到的html
get_ip(bsObj)
time.sleep(900) # 每十五分鐘更新一次
if __name__ == '__main__':
start(HTTPS_URL)
執行結果
會在當前目錄生成Proxy-IP.txt
文字檔案,開啟txt
檔案可以看到爬取並篩選過的的代理IP
資料。
隨機選擇本地txt檔案中的代理IP
讀取代理IP程式
import random
FILE = './Proxy-IP.txt' # 讀取的txt檔案路徑
# 獲取代理IP
def proxy_ip():
ip_list = []
with open(FILE, 'r') as f:
while True:
line = f.readline()
if not line:
break
ip_list.append(line.strip())
ip_port = random.choice(ip_list)
return ip_port
def start():
ip_port = proxy_ip() # 隨機獲取到的代理IP
print(ip_port)
if __name__ == '__main__':
start()
執行結果
每一次的執行結果提取出來不一樣,達到了隨機使用代理IP
的效果
第一次執行結果:
122.72.18.35:80
第二次執行結果:
49.87.75.5:35407
第三次執行結果:
114.113.126.87:80