1. 程式人生 > >爬取西刺代理IP存入本地txt檔案作為代理IP池(未加入是否可用驗證)

爬取西刺代理IP存入本地txt檔案作為代理IP池(未加入是否可用驗證)

執行環境:Python3.5.3Windows 10 RS4Pycharm 2017.2.4

前言

我們在爬取資料時,經常會因為請求太過頻繁導致反爬機制生效,不少伺服器的反爬機制是針對訪問主機IP進行限制訪問,返回503HTTP狀態碼。所以我們可以在爬蟲請求中加入代理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