Python爬取快代理

前天,本人在爬取某網站時,第一次遇到IP被封的情況,等了幾個小時之後,還是不行。最後,迫於無奈,還是請出了大招,使用代理IP。今天,閒來無事,本人爬取了快代理網站上 5 萬多條免費高匿名代理IP。
首先,我們進入網站免費代理頁面,可以看到該網站目前共有免費代理IP 3482 頁。免費代理IP首頁的url地址爲:https://www.kuaidaili.com/free/inha/。
在這裏插入圖片描述
你可能會疑惑,我們的目標是爬取三千多頁的代理IP信息,上面只提到了首頁的url地址,如何知道其餘頁面的url地址呢?這時,不用着急,我們再點開第二頁,可以看到第二頁的url地址爲https://www.kuaidaili.com/free/inha/2/,仔細觀察就會發現,該url地址結尾有一個數字 2 ,你可能會想,第三頁會不會就是3呢?事實上,正是如此,後面的以此類推……
在這裏插入圖片描述
這樣,從第 2 頁至最後一頁的url地址所符合的規律我們已經找到了。其實,這種情況是很常見的,而且,首頁url地址也可以是這樣的,即url地址https://www.kuaidaili.com/free/inha/1/和https://www.kuaidaili.com/free/inha/對應的是同一頁面。知道了這一點,我們就可以使用format()方法輕鬆寫出每一頁的url地址,代碼如下:

url = 'https://www.kuaidaili.com/free/inha/{}/'.format(str(i))

好了,上面重要的問題已經分析完了,下面我們開始分析頁面內容並嘗試爬取所需信息。我們的目標是爬取每一頁表格內的所有內容,下面以第一頁內容爲例分析。跟之前一樣,我們先右鍵檢查,可以看到如下頁面:
在這裏插入圖片描述
通過觀察發現,可以使用正則表達式re模塊的findall()方法匹配相關信息,下面我們開始編寫程序。
首先,我們需要導入所需的庫,代碼如下:

# 導入相關模塊庫
import requests
import re
import os
import time

下面我們嘗試編寫一個函數,用於匹配單個免費代理頁面的所有信息。

 def get_ipinfo(url):
     '''定義一個函數,用於獲取單個頁面的IP代理信息'''
     r = requests.get(url, headers={'user-agent':'Mozilla/5.0'}) # 獲取網頁內容
     html = r.text # 獲取http響應內容的字符串形式
 
     # 利用正則表達式匹配IP、PORT、匿名度、類型、位置、響應速度、最後驗證時間信息
     ip = re.findall('<td data-title="IP">((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))</td>', html) # 匹配IP信息
     port = re.findall('<td data-title="PORT">(\d+)</td>', html) # 匹配端口號信息
     anonymity = re.findall('<td data-title="匿名度">([\u4e00-\u9fa5]+)</td>', html) # 匹配匿名度信息
     genre = re.findall('<td data-title="類型">(.+)</td>', html) # 匹配類型信息
     position = re.findall('<td data-title="位置">([\u4e00-\u9fa5 ]+)</td>', html) # 匹配位置信息
     speed = re.findall('<td data-title="響應速度">(.+)</td>', html) # 匹配響應速度信息
     time = re.findall('<td data-title="最後驗證時間">(.+)</td>', html) # 匹配驗證時間信息

     ipinfo = zip(ip, port, anonymity, genre, position, speed, time) # 將本頁面匹配信息壓縮,寫入csv文件
     return ipinfo

匹配到信息之後,就需要將該頁信息寫入到一個csv文件中,下面我們將通過編寫一個函數實現該功能,代碼如下:

 def write_ipinfo(ipinfo, page):
     '''定義一個函數,將IP代理信息寫入到指定的csv文件中'''
     path = 'C:\\Users\\Lenovo\\Desktop\\IP代理' # 待寫入文件存儲目錄
     if not os.path.exists(path): # 判斷桌面是否有名稱爲“IP代理”的文件夾,如果沒有,就創建它
         os.mkdir(path)
 
     # 將匹配信息寫入csv文件
     with open(path + '//代理IP.csv', 'a' ,newline='') as f:
         writer = csv.writer(f)
         if page == 1:
             writer.writerow(['IP', 'PORT', '匿名度', '類型', '位置', '響應速度', '最後驗證時間']) # 寫入表頭信息
         writer.writerows(ipinfo) # 寫入單個頁面匹配信息

通過上述兩個函數,我們已經能夠實現對某個頁面信息的爬取和保存,下面只需要遍歷每一頁的url地址就可以爬取所有頁面的免費代理IP信息,代碼如下:

if __name__ == '__main__':
    for page in range(3482):
        url = 'https://www.kuaidaili.com/free/inha/{}/'.format(str(page+1))
        ipinfo = get_ipinfo(url)
        write_ipinfo(ipinfo, page+1)
        time.sleep(1)

好了,利用上述程序,我們已經實現了免費代理IP的爬取工作,共計爬取代理IP信息 5萬多條,下面是爬取的部分內容:
在這裏插入圖片描述
好了,以上就是本期內容,謝謝您的閱讀!
覺得不錯?掃描下方二維碼,關注本人公衆號【Python無憂】,瞭解更多,謝謝您的支持!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章