python爬蟲之抓取代理服務(wù)器IP

前言

使用爬蟲爬取網(wǎng)站的信息常常會(huì)遇到的問題是,你的爬蟲行為被對(duì)方識(shí)別了,對(duì)方把你的IP屏蔽了,返回不了正常的數(shù)據(jù)給你。那么這時(shí)候就需要使用代理服務(wù)器IP來偽裝你的請(qǐng)求了。
免費(fèi)代理服務(wù)器網(wǎng)站有:

下面我們以西刺免費(fèi)代理IP為例子看看是如何獲取可用IP的。主要分為以下幾個(gè)步驟:

  1. 請(qǐng)求url,獲取網(wǎng)頁數(shù)據(jù)
  2. 解析網(wǎng)頁數(shù)據(jù),找到包含【IP地址】和【端口】信息的節(jié)點(diǎn),解析出這兩個(gè)數(shù)據(jù)
  3. 驗(yàn)證取得的【IP地址】和【端口】信息是否可用
  4. 將驗(yàn)證可用的【IP地址】和【端口】信息保存起來(暫存到列表,或保存到文件,保存到數(shù)據(jù)庫)

1. 請(qǐng)求網(wǎng)頁數(shù)據(jù)

請(qǐng)求網(wǎng)頁數(shù)據(jù)是使用requests庫去做網(wǎng)絡(luò)請(qǐng)求的,填入url,和header頭部信息,使用get請(qǐng)求方式去請(qǐng)求,得到response相應(yīng)后,返回response.text即是響應(yīng)的文本內(nèi)容,即網(wǎng)頁文本內(nèi)容。

# 請(qǐng)求url,獲取網(wǎng)頁數(shù)據(jù)
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

用瀏覽器打開網(wǎng)址看一下


python獲取代理服務(wù)器ip

2. 解析網(wǎng)頁數(shù)據(jù)

返回正確的網(wǎng)頁數(shù)據(jù)之后,就可以開始對(duì)它進(jìn)行解析了,這里使用BeautifulSoup庫進(jìn)行網(wǎng)頁內(nèi)容解析。如果是Chrome瀏覽器,按f12可以查看網(wǎng)頁源碼,如圖


python獲取代理服務(wù)器ip

找到某個(gè)tr行,第1個(gè)和第2個(gè)td列就是是ip和端口信息,因此我們可以用BeautifulSoup查找所以的tr行,再查找該tr行的第1個(gè)和第2個(gè)td列即可以獲取該頁面上所有的ip和端口信息了。

# 解析網(wǎng)頁數(shù)據(jù),獲取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('發(fā)現(xiàn)ip:%s' % ip_temp)
        list.append(ip_temp)
    return list

3. 驗(yàn)證IP和端口是否可用

解析到頁面上的所有ip和端口信息后,還需要驗(yàn)證它是否是有效的,然后對(duì)它們進(jìn)行過濾,獲取有效的ip列表。驗(yàn)證方法就是使用它作為代理地址,去請(qǐng)求網(wǎng)絡(luò),看是否能請(qǐng)求成功,如果請(qǐng)求成功,說明是有效的。當(dāng)然,這里需要加上超時(shí)時(shí)間,以避免等待時(shí)間過長,這里設(shè)置超時(shí)時(shí)間為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

# 驗(yàn)證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. 發(fā)起請(qǐng)求,保存可用IP和端口信息

接下來要開始調(diào)用以上代碼了。這里只爬取第1頁數(shù)據(jù)

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

    allProxys = []

    startPage = 0
    endPage = 1

    for index in range(startPage, endPage):
        print('查找第 %s 頁的ip信息' % index)

        # 請(qǐng)求url,獲取網(wǎng)頁數(shù)據(jù)
        content = _requestUrl(index)
        # 解析網(wǎng)頁數(shù)據(jù),獲取ip和端口信息
        list = parseProxyIpList(content)
        # 過濾有效的ip信息
        list = filterValidProxyIp(list)
        # 添加到有效列表中
        allProxys.append(list)

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

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

    return allProxys

運(yùn)行該爬蟲程序之后,就可以開始爬取代理服務(wù)器信息了。如圖

python獲取代理服務(wù)器ip

python獲取代理服務(wù)器ip

python獲取代理服務(wù)器ip

總結(jié)

通過以上步驟就可以獲取有效的代理服務(wù)器IP信息了,其他代理服務(wù)器IP網(wǎng)站的獲取方式和這個(gè)大同小異,主要在于解析網(wǎng)頁數(shù)據(jù)那里,需要找到包含IP和端口數(shù)據(jù)的標(biāo)簽,然后解析獲取到。有了代理服務(wù)器IP,你就可以爬取更多網(wǎng)站的信息了。

還有個(gè)問題是,網(wǎng)站可能會(huì)對(duì)某個(gè)IP檢測,如果超過一定請(qǐng)求次數(shù),就會(huì)對(duì)其進(jìn)行屏蔽,那這樣會(huì)導(dǎo)致程序中斷,無法獲取所有的信息,這如何解決呢?歡迎關(guān)注我的微信公眾號(hào)hesong,了解具體應(yīng)對(duì)方式。

附上源碼地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • 名詞延伸 通俗的說,域名就相當(dāng)于一個(gè)家庭的門牌號(hào)碼,別人通過這個(gè)號(hào)碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,793評(píng)論 2 56
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,346評(píng)論 6 13
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 21,566評(píng)論 24 176
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,789評(píng)論 11 349

友情鏈接更多精彩內(nèi)容