Python爬蟲技術拆解1:獲取代理IP集合

Python這麼語言很多人剛開始的項目都是寫個小爬蟲,但是大家在寫的時候發現經常會被目標網站給拒絕。

目標網站拒絕你千百遍,你待她依然如初戀。如何敲開初戀的大門,這裏不得不說下代理IP。

因爲很多網站爲了拉新,不讓老客戶不停的訪問(作了訪問限制)。大家在拉數據的時候,需要每次替換不同的訪問IP。這樣目標網站會以爲你是新用戶,就會放你進去。

國內免費的代理IP網站,一般以西刺代理比較火。域名https://xicidaili.com/

一個一個的去替換,顯示不出我們的身份,作爲技術員,我們應該有我們的出場方式:

這裏主要用到了以下幾個技術:

1、requests。requests 主要是用來作網絡傳輸用的。簡單點來說就是你本機和目標網站通信之間的通道,是由它來負責的。

 導入模塊

#導入模塊 這個模塊不是默認的,需要使用pip 進行安裝。

import requests  

進行網絡請求,這裏使用的是get

#獲得返回信息。 url是目標網址。這裏是西刺代理的。 headers 是請求的頭部構造
resp = requests.get(url, headers=req_header)

#判斷返回的結果碼是否是正常的。
if resp.status_code == requests.codes.ok:

2、lxml。它是一個解析庫,支持HTML和XML的解析,支持XPath解析方式。用來進行對返回的信息進行解析。獲取到你需要的信息。你可以簡單理解爲它爲DOM對象。


selector = etree.HTML(resp.text)

#Xpath解析返回的html對象拼接成數組
td_data = [i.xpath("td/text()") for i in selector.xpath('//table[@id="ip_list"]/tr')[1:] ]

#進行返回值的篩選拼接
ip_list += [ [data[5].strip(),"".join([data[0],":",data[1]])] for data in td_data  if   data[5].strip().lower() == 'https']

最終結果如下:

下面是代碼全部:

#!/usr/bin/python3
# -*- coding: utf-8 -*-  

import requests
from lxml import etree

#獲取代理列表
def get_proxy_ip(proxy_url_type="http"):
    if proxy_url_type=="https":
        url = "https://www.xicidaili.com/wn/"
    else:
        url = "https://www.xicidaili.com/wt/"

    req_headers = [
            { "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
            },
            { "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
            },
        ]
    # 獲取最後一頁,這個地方偷懶了,沒有去計算,而是直接打開頁面看有多少頁就寫上去了
    #有興趣的可以自己使用Xpath 去計算一下。
    last_page_num = 4049
    arr_index = random.randint(1, len(req_headers) - 1)
    req_header = req_headers[arr_index]

    #IP存放列表
    p_list = []

    for i in range(1, last_page_num): 
        
        #訪問地址
        url +=str(i)
        #獲得返回信息。 url是目標網址。這裏是西刺代理的。 headers 是請求的頭部構造
        resp = requests.get(url, headers=req_header)

        #判斷返回的結果碼是否是正常的。
        if resp.status_code == requests.codes.ok:
            selector = etree.HTML(resp.text)
            #tr_data = selector.xpath('//table[@id="ip_list"]/tr') 
            td_data = [i.xpath("td/text()") for i in selector.xpath('//table[@id="ip_list"]/tr')[1:] ]
         
            ip_list += [ [data[5].strip(),"".join([data[0],":",data[1]])] for data in td_data  if   data[5].strip().lower() == 'https']
            
            time.sleep(1)

        return ip_list


if __name__ == '__main__':
   
    proxy_ips = get_proxy_ip("https") 
    print(proxy_ips)

    pass

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