一篇文章讓你擁有用不完的ip代理

本文包含代碼所需的python外置庫:

  • requests
  • BeautifulSoup4

本文尤其適合對python爬蟲有一定了解的人群,但是如果你是小白,也能從文章中獲取一些互聯(lián)網(wǎng)的知識

背景

隨著大數(shù)據(jù)時(shí)代來臨,數(shù)據(jù)對于我們每個(gè)人來說都越來越重要,而互聯(lián)網(wǎng)又是最重要、最廣泛的數(shù)據(jù)獲取來源。

在這個(gè)時(shí)代下,我們每個(gè)人都應(yīng)該掌握一定的從互聯(lián)網(wǎng)獲取信息的能力。而python爬蟲,就是我們從互聯(lián)網(wǎng)獲取信息的利器!

當(dāng)我們運(yùn)用python爬蟲從互聯(lián)網(wǎng)上獲取信息時(shí),經(jīng)常的會遇到被封IP的尷尬情況。

這是由于我們的爬蟲占據(jù)了網(wǎng)站太多的服務(wù)器資源而又對它幾乎沒有任何益處,所以人家當(dāng)然不允許你這么做。
所以我們需要使用代理來避免這種情況。

正文

網(wǎng)上有一些專門提供代理IP的網(wǎng)站,這里展現(xiàn)了兩個(gè),如果需要更多可以自行搜索查找。

1.西刺免費(fèi)代理
免費(fèi)IP非常多,這個(gè)網(wǎng)站也在很早就有了,但是有一個(gè)缺點(diǎn),我爬取這個(gè)網(wǎng)站上的代理的時(shí)候爬不了幾頁就被封了!即使我每爬一頁都設(shè)置了3秒鐘的間隔。難道我還要用代理來爬取代理?于是我又找其他的代理網(wǎng)站。

2.西拉ip代理官網(wǎng)
本篇文章是使用這個(gè)網(wǎng)站爬取的IP,網(wǎng)站界面很好看,IP也很多,并且還提供了API每天五百個(gè)免費(fèi)的量,重要的是封IP沒那么嚴(yán),爬取的時(shí)候可以放心爬(但是最好不要對它的服務(wù)器造成太大負(fù)荷,我是每一頁間隔兩秒鐘)

先講思路,代碼放在下面:
1.請求網(wǎng)頁的內(nèi)容
2.使用BeautufulSoup4分析網(wǎng)頁內(nèi)容,提煉出需要的內(nèi)容
3.程序可自主選擇爬取http還是https的代理,高匿名還是透明代理(推薦高匿名),爬取多少頁
4.多線程對爬取下來的ip進(jìn)行可用性檢測(畢竟是免費(fèi)的代理,很多都不能用的,需要自己進(jìn)行檢測)
5.寫入文件(這部分可以改動)</br>

思路代碼分析

  • 請求網(wǎng)頁內(nèi)容使用requests庫的get方法就可以,并且在在get函數(shù)中傳入proxies參數(shù),參數(shù)是一個(gè)字典,類似下面這樣

通過 requests.get(url=url, headers=header,proxies={"http":"http://xx.xx.xx.xx"}, timeout=5) 使用http協(xié)議的ip代理
或者
通過requests.get(url=url, headers=header,proxies={"https":"https://xx.xx.xx.xx"}, timeout=5)使用https協(xié)議的ip代理

  • 西拉代理官網(wǎng)的元素很好分析,使用bs4幾行就分析好了
西拉元素分析

我們需要的是上面截圖中三個(gè)箭頭的元素,因?yàn)楸境绦蛱峁﹉ttp和https的選擇功能,還有匿名度的選擇功能。
如果有需要其它選擇選項(xiàng)比如代理位置或者響應(yīng)速度什么的,可以自行修改,或者可以聯(lián)系我。

  • 幾個(gè)選項(xiàng)使用if判斷語句判斷一下分析出來的元素就可實(shí)現(xiàn)

  • ip可用性檢測的方法是使用這個(gè)代理訪問網(wǎng)站,若是訪問成功則說明https代理有效,而http代理步驟稍多一步。http代理檢測,是訪問一個(gè)ip網(wǎng)站,這個(gè)網(wǎng)站會分析訪問過來的ip并顯示在頁面上,我們獲取這個(gè)元素然后和我們的代理進(jìn)行比對來判斷是否有效。多線程是由于若是ip不可用則至少花費(fèi)5秒鐘時(shí)間等待,這樣顯得效率十分低下,所以開多線程(鑒于GIL鎖的存在,此處的多線程與python的協(xié)程差不多,有不懂的可以私信我)

  • 寫入文件這一部分很簡單,但是可以作改動,因?yàn)閺木W(wǎng)上爬取下來的ip可能隨時(shí)會失效,所以使用文件保存是不好的,最好是隨時(shí)爬取,有效就直接用。可以考慮改造一下函數(shù)變成一個(gè)列表生成器,每次yield一個(gè)列表出去,列表里面放置了有效的ip。

代碼

import requests
from bs4 import BeautifulSoup
import time
import threading

IP_MODE = 1  # 1. http   2.https
NI_MING_MODE = 1  # 1.高匿   2.透明
PAGE = 50  # 默認(rèn)爬取50頁

url = ""
if IP_MODE == 1:
    url = "http://www.xiladaili.com/http/{}/"
elif IP_MODE == 2:
    url = "http://www.xiladaili.com/https/{}/"
else:
    # 輸入其它數(shù)字默認(rèn)為http
    url = "http://www.xiladaili.com/http/{}/"


header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"}


def test_http(host):
    """
    檢測http代理IP是否有效并將有效IP寫入文件
    """
    ip = {}
    ip["http"] = "http://" + host
    # 通過訪問下面這個(gè)ip檢測網(wǎng)站來判斷
    url = "http://ip.tool.chinaz.com/"


    # http無效的情況大致有兩種 1.無法訪問這個(gè)網(wǎng)頁,那么這個(gè)代理不可用 2.能訪問網(wǎng)頁但是沒有達(dá)到代理效果,即仍然使用的自己的ip訪問網(wǎng)頁

    try:
        html = requests.get(url=url, headers=header,
                            proxies=ip, timeout=5).text
    except:
        return
    else:
        soup = BeautifulSoup(html, "lxml")

        try:
            real_ip = soup.select_one(".fz24").text
        except:
            return
        if real_ip == host.split(":")[0]:
            print("有效IP:" + host)
            with open("xila_http_list.txt", "a") as af:
                af.write(host + " ")
        else:
            return


def test_https(host):
    """
    檢測https代理是否有效,并將有效IP寫入文件
    """
    ip = {}
    ip["https"] = "https://" + host

    url = "https://blog.csdn.net/luoyangIT"

    # https檢測只能通過檢查是否能訪問https協(xié)議的網(wǎng)頁來判斷,若有其它方法則繼續(xù)增加

    try:
        html = requests.get(url=url, headers=header,
                            proxies=ip, timeout=5).text
    except:
        return
    else:
        print("有效IP:" + host)
        with open("xila_https_list.txt", "a") as af:
            af.write(host + " ")


def main():
    """
    主函數(shù),入口
    """
    for i in range(1, PAGE):
        # 延時(shí),避免對服務(wù)器造成太大負(fù)荷,同時(shí)在延時(shí)時(shí)間內(nèi)檢測代理可用情況
        time.sleep(3)
        # 請求頁面text
        html = requests.get(url=url.format(i), headers=header).text
        soup = BeautifulSoup(html, "lxml")
        # 分析元素
        tr_list = soup.select_one(".fl-table").select_one("tbody").select("tr")
        # 獲取元素
        for td_list in tr_list:
            # 高匿
            if NI_MING_MODE == 1 and "高匿" in td_list.select("td")[2].text:

                # http
                if IP_MODE == 1:
                    t = threading.Thread(target=test_http, args=(
                        td_list.select("td")[0].text,))
                    t.start()

                # https
                elif IP_MODE == 2 and test_https(td_list.select("td")[0].text):
                    t = threading.Thread(target=test_https, args=(
                        td_list.select("td")[0].text,))
                    t.start()

            # 透明
            elif NI_MING_MODE == 2 and "透明" in td_list.select("td")[2].text:

                # http
                if IP_MODE == 1:
                    t = threading.Thread(target=test_http, args=(
                        td_list.select("td")[0].text,))
                    t.start()

                # https
                elif IP_MODE == 2:

                    t = threading.Thread(target=test_https, args=(
                        td_list.select("td")[0].text,))
                    t.start()


if __name__ == "__main__":
    main()

代碼中我已附上大量注釋,希望大家都能看懂,不懂得可以私信我交流。

我是落陽,謝謝你的到訪!希望大家都平平安安健健康康!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評論 2 379