解决被西刺代理封ip的问题
網上有很多講 用 Python 爬取代理 ip 的文章,如此的文章一搜就有一堆,我自個按照相關的教程嘗試了下,確實能夠抓取到很多 ip。不過在把 ip 保存到本地文件的過程中,由于保存的格式不美觀,我嘗試修改代碼以改變保存格式,因為在爬取的時候只設置了 Use-Agent,沒有設置 proxy,所以在多次運行爬蟲腳本后,最后成功被西刺代理網站封掉了我真實的 ip。這下再也不能訪問西刺代理的網站了…
該網頁無法正常運作 www.xicidaili.com 目前無法處理此請求。 HTTP ERROR 503既然電腦不能訪問西刺代理官網,我就嘗試用手機去訪問,用手機流量可以打開西刺網站,用手機連接 WiFi 不能打開西刺網站。
用手機流量訪問西刺代理,查看國內普通代理頁面,在爬蟲腳本中加入 普通代理ip,代碼如下
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36','Host':'www.xicidaili.com'} url = 'http://www.xicidaili.com/nn/' proxy = '218.28.58.150:53281' proxies = {'http':'http://' + proxy } res = requests.get(url,headers=headers,proxies=proxies) print(res.status_code)更改多次代理 ip 后,有的返回 503,有的返回 ...Max retries exceeded with url...,如果自己隨便設置一個 ip 和端口,返回的結果是 ...Max retries exceeded with url...,這就說明了一個問題,有用的代理 ip 被西刺網站給拒絕了,暫時不知道為什么設置了有用的代理 ip,還是被西刺代理屏蔽,這里我想到的一個原因是用普通代理還是會被西刺識別出真實 ip,而我嘗試用高匿代理去測試,沒找到一個可用的高匿代理,gg 思密達。
經過幾個小時的摸索,總算找到了一個可行的方法。下面記錄下自己的摸索過程。
在百度首頁輸入關鍵字 “ip”,會在結果頁顯示自己電腦的 ip 地址,如果電腦用了代理 ip,結果頁就會顯示代理 ip。
為了檢測西刺代理的 ip 是否能用,可以這樣做:依次打開 IE 瀏覽器 --> Internet選項 --> 連接 --> 局域網設置 --> 代理服務器下邊的復選框選中,寫上代理 ip 和端口,如果設置無誤,而且代理 ip 可用,那么在百度首頁輸入 “ip”,顯示的則是代理 ip 地址。訪問西刺代理網站,顯示 HTTP ERROR 503;
還有一種檢測方法,用 Python 中的 selenium 模塊模擬谷歌瀏覽器訪問。加入西刺代理官網上的普通代理 ip 后訪問西刺官網,竟然可以瀏覽,這也是無意間發現的。至于 selenium 如何使用,這里不做過多介紹,下面貼出源碼:
from selenium import webdriver from bs4 import BeautifulSoup import json,time'''模擬谷歌瀏覽器訪問西刺代理網站,并返回前5頁的網頁源代碼''' def get_page_source(start_url):chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--proxy-server=http://' + proxy)browser = webdriver.Chrome(chrome_options=chrome_options) #加入代理browser.get(start_url)html = browser.page_source #獲取單個網頁的源代碼htmls.append(html)time.sleep(2)for page in range(1,5): #獲取2-5頁的內容next_page = browser.find_element_by_class_name('next_page') #獲取下一頁按鈕next_page.click() #點擊下一頁按鈕html = browser.page_sourcehtmls.append(html)time.sleep(2)'''從網頁源代碼中獲取代理ip''' def get_http_proxy(htmls):for html in htmls:soup = BeautifulSoup(html, 'lxml')item = soup.find('table')trs = item.find_all('tr')for tr in trs[1:]:http_proxy = {} #把代理ip保存成字典格式td = tr.find_all('td')http_proxy['ip'] = td[1].texthttp_proxy['port'] = td[2].texthttp_proxy['protocol'] = td[5].textif td[5].text == 'HTTPS': #把HTTP和HTTPS分開保存到兩個不同的文件中L_https.append(http_proxy)else:L_http.append(http_proxy)'''把HTTP和HTTPS分開保存到兩個不同的文件中''' def save_file():file_http = 'http_proxys.json'file_https = 'https_proxys.json'with open(file_http, 'w', encoding='utf-8') as f:f.write(json.dumps(L_http, indent=2)) #indent=2 表示帶上縮進,這樣json文件比較美觀with open(file_https, 'w', encoding='utf-8') as f:f.write((json.dumps(L_https, indent=2)))if __name__ == '__main__':htmls = []L_http = []L_https = []proxy = '218.28.58.150:53281' #這個ip和端口要換成可用的代理ipstart_url = 'https://www.xicidaili.com/nn/1' #這個是西刺代理ip官網高匿ip的第一頁get_page_source(start_url) #獲取網頁的源代碼get_http_proxy(htmls) #從網頁源代碼中獲取代理ipsave_file() #把代理ip保存到json文件print('Done!')最后總結:本篇主要記錄被西刺封掉本地ip后如何訪問西刺,沒有介紹如何驗證抓取到的 ip 的有效性,代理 ip 池的維護以后再搞。
總結
以上是生活随笔為你收集整理的解决被西刺代理封ip的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JulyNovel-React
- 下一篇: C#InI文件读写剖析