1. 程式人生 > >python爬蟲之抓取代理伺服器IP

python爬蟲之抓取代理伺服器IP

轉載請標明出處:
http://blog.csdn.net/hesong1120/article/details/78990975
本文出自:hesong的專欄

前言

使用爬蟲爬取網站的資訊常常會遇到的問題是,你的爬蟲行為被對方識別了,對方把你的IP遮蔽了,返回不了正常的資料給你。那麼這時候就需要使用代理伺服器IP來偽裝你的請求了。
免費代理伺服器網站有:
- 西刺免費代理IP
- 快代理
- 66免費代理
下面我們以西刺免費代理IP為例子看看是如何獲取可用IP的。主要分為以下幾個步驟:
1. 請求url,獲取網頁資料
2. 解析網頁資料,找到包含【IP地址】和【埠】資訊的節點,解析出這兩個資料
3. 驗證取得的【IP地址】和【埠】資訊是否可用
4. 將驗證可用的【IP地址】和【埠】資訊儲存起來(暫存到列表,或儲存到檔案,儲存到資料庫)

1. 請求網頁資料

請求網頁資料是使用requests庫去做網路請求的,填入url,和header頭部資訊,使用get請求方式去請求,得到response相應後,返回response.text即是響應的文字內容,即網頁文字內容。

# 請求url,獲取網頁資料
def _requestUrl(index):
    src_url = 'http://www.xicidaili.com/nt/'
    url = src_url + str(index)
    if index == 0:
        url = src_url

    headers = {
        'User-Agent'
: 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0' } response = requests.get(url, headers=headers) return response.text

用瀏覽器開啟網址看一下
python獲取代理伺服器ip

2. 解析網頁資料

返回正確的網頁資料之後,就可以開始對它進行解析了,這裡使用BeautifulSoup庫進行網頁內容解析。如果是Chrome瀏覽器,按f12可以檢視網頁原始碼,如圖
python獲取代理伺服器ip
找到某個tr行,第1個和第2個td列就是是ip和埠資訊,因此我們可以用BeautifulSoup查詢所以的tr行,再查詢該tr行的第1個和第2個td列即可以獲取該頁面上所有的ip和埠資訊了。

# 解析網頁資料,獲取ip和埠資訊
def parseProxyIpList(content):
    list = []

    soup = BeautifulSoup(content, 'html.parser')
    ips = soup.findAll('tr')
    for x in range(1, len(ips)):
        tds = ips[x].findAll('td')
        ip_temp = 'http://' + tds[1].contents[0] + ':' + tds[2].contents[0]
        print('發現ip:%s' % ip_temp)
        list.append(ip_temp)
    return list

3. 驗證IP和埠是否可用

解析到頁面上的所有ip和埠資訊後,還需要驗證它是否是有效的,然後對它們進行過濾,獲取有效的ip列表。驗證方法就是使用它作為代理地址,去請求網路,看是否能請求成功,如果請求成功,說明是有效的。當然,這裡需要加上超時時間,以避免等待時間過長,這裡設定超時時間為5秒。

# 過濾有效的ip資訊
def filterValidProxyIp(list):
    print('開始過濾可用ip 。。。')
    validList = []
    for ip in list:
        if validateIp(ip):
            print('%s 可用' % ip)
            validList.append(ip)
        else:
            print('%s 無效' % ip)
    return validList

# 驗證ip是否有效
def validateIp(proxy):
    proxy_temp = {"http": proxy}
    url = "http://ip.chinaz.com/getip.aspx"
    try:
        response = requests.get(url, proxies=proxy_temp, timeout=5)
        return True
    except Exception as e:
        return False

4. 發起請求,儲存可用IP和埠資訊

接下來要開始呼叫以上程式碼了。這裡只爬取第1頁資料

# 獲取可用的代理ip列表
def getProxyIp():

    allProxys = []

    startPage = 0
    endPage = 1

    for index in range(startPage, endPage):
        print('查詢第 %s 頁的ip資訊' % index)

        # 請求url,獲取網頁資料
        content = _requestUrl(index)
        # 解析網頁資料,獲取ip和埠資訊
        list = parseProxyIpList(content)
        # 過濾有效的ip資訊
        list = filterValidProxyIp(list)
        # 新增到有效列表中
        allProxys.append(list)

        print('第 %s 頁的有效ip有以下:' % index)
        print(list)

    print('總共找到有效ip有以下:')
    print(allProxys)

    return allProxys

執行該爬蟲程式之後,就可以開始爬取代理伺服器資訊了。如圖
python獲取代理伺服器ip
python獲取代理伺服器ip
python獲取代理伺服器ip

總結

通過以上步驟就可以獲取有效的代理伺服器IP資訊了,其他代理伺服器IP網站的獲取方式和這個大同小異,主要在於解析網頁資料那裡,需要找到包含IP和埠資料的標籤,然後解析獲取到。有了代理伺服器IP,你就可以爬取更多網站的資訊了。

還有個問題是,網站可能會對某個IP檢測,如果超過一定請求次數,就會對其進行遮蔽,那這樣會導致程式中斷,無法獲取所有的資訊,這如何解決呢?歡迎關注我的微信公眾號hesong,瞭解具體應對方式。

附上原始碼地址

我的部落格
GitHub
我的簡書
群號:194118438,歡迎入群
微信公眾號 hesong ,微信掃一掃下方二維碼即可關注: