為反反爬蟲,打造一個自己的IP池?Python獲取西刺代理IP並驗證!
阿新 • • 發佈:2018-11-17
胡蘿蔔醬最近在爬取知乎使用者資料,然而爬取不了一會,IP就被封了,所以去爬取了西刺代理IP來使用。
這裡爬取的是西刺國內高匿IP。我們需要的就是這一串數字。
分析原始碼後,發現數據非常的明瞭,都是存在表格裡面,一行一行的展示,因此,我們只需要把這些資料存下來即可。為了防止IP被封,我們通過設定獲取網頁睡眠時間和隨機選取header的方法。同時,我們通過百度來驗證這些IP是否可用,可用的話,就存起來。
1import requests 2import re 3import time 4import random 5from bs4 import BeautifulSoup 6import pandas as pd 7keys = [ 8 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', 9 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', 10 'Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', 11 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0', 12 'Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0', 13 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36', 14 'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19', 15 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3', 16 'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3' 17] 18def get_ip_list(k): 19 ip_list = [] 20 print("正在獲取代理列表...") 21 for i in range(1,k+1): 22 try: 23 url = 'http://www.xicidaili.com/nn/' + str(i) 24 header = {'User-Agent': keys[random.randint(0, len(keys) - 1)]} 25 html = requests.get(url=url, headers=header).text 26 soup = BeautifulSoup(html, 'lxml') 27 ips = soup.find(id='ip_list').find_all('tr') 28 for j in range(1, len(ips)): 29 ip_info = ips[j] 30 tds = ip_info.find_all('td') 31 ip = tds[1].text + ':' + tds[2].text 32 # 用這個網頁去驗證,遇到不可用ip會拋異常 33 url = "https://www.baidu.com/" 34 try: 35 proxies = {'http': 'http://' + ip} 36 res = requests.get(url, headers=header, proxies=proxies).text 37 ip_list.append('http://' + ip) 38 except Exception as e: 39 print (e) 40 continue 41 print("第{}頁代理列表抓取成功.".format(i)) 42 time.sleep(5 + float(random.randint(1,100)) /20) 43 except Exception as e: 44 print('error:',e) 45 return ip_list 46ip_list = get_ip_list(20) 47 48pd.DataFrame(columns = ['ip'], data = ip_list).to_csv('ip_list.csv',encoding='utf-8',index = False) 49print('一共獲得{}個IP地址'.format(len(ip_list)))
不足五十行的程式碼,我們就獲取2000個可用IP,在以後需要爬取其他網頁,就可以隨時調取一個來使用。值得注意的是,這些IP可能會過期,建議驗證後使用,若失效則從IP池裡刪除。