那些年,我爬過的北科(七)——反反爬蟲之使用代理ip

內容介紹

本章將要介紹一下如何使用代理ip解決反爬蟲的禁ip的問題,並擴展瞭解一下代理ip池的構建與adsl服務器的使用。html

代理ip初探

如何獲取本身的ip

下面,咱們先來看一下如何獲取本身的ip地址。咱們直接在百度上搜索ip,或者經過www.ip138.com/這個網站就能夠。好比說我如今的ip以下:python

ip做爲一個身份信息,通常是不會變的,想要改變本身的ip的方法就是找代理了。git

所謂代理,其實就是好比說咱們要訪問一個網頁,但這個時候咱們不本身去訪問,而是告訴代理咱們想要訪問什麼,而後代理用本身的ip去訪問,再返回給咱們。這樣網站其實拿到的不是咱們的真實ip,而是代理的ip。github

python中使用代理ip

免費的代理ip有不少,雖然這種網站都不會提供太多的代理ip。咱們這裏以西刺代理的免費ip爲例,看看在python中如何使用代理ip。數據庫

首先打開www.xicidaili.com/nn/,能夠看到這裏有不少代理ip。服務器

這裏能夠根據當日的狀況挑選一個ip,我這裏選擇了139.129.207.72:808這個代理。而後咱們編寫代碼,調用ip138的接口,查看一下本身使用代理後的ip是否改變。併發

import requests
from bs4 import BeautifulSoup


def parse_ip(content):
    soup = BeautifulSoup(content, "html.parser")
    print(soup.body.get_text())

resp = requests.get("http://2018.ip138.com/ic.asp")
parse_ip(resp.content.decode("gbk"))

print("\n改變ip後:")
proxies = {"http": "http://139.129.207.72:808"}  # 須要改爲在西刺代理上看到的可用代理ip
resp2 = requests.get("http://2018.ip138.com/ic.asp", proxies=proxies)
parse_ip(resp2.content.decode("gbk"))
複製代碼

能夠看到使用前,個人ip仍是北京的ip,使用後變成了山東的ip了。 網站

構建代理ip池

在使用代理ip時,咱們通常都會去花錢買一些可用的ip或者是購買包月服務。但實際上,買來的ip並非都能用的,並且大多時候是不少都不能用,不能用比例很是之高。url

代理ip池的目標其實就是要驗證那些能用,哪些不能用,若是可用,就把可用的ip放到一個「池子」裏。等咱們爬蟲程序須要ip的時候,從「池子」裏拿就行了。spa

這裏咱們不會去本身寫一個代理ip池子,而是舉一個例子:好比說咱們想要爬取鏈家網的房價數據。

Validator編寫

咱們須要首先寫一個驗證器validator來驗證ip是否可用。好比說在以前爬鏈家的時候,若是ip被禁了以後,就會跳轉到一個驗證的頁面,讓咱們點擊倒着的房子進行驗證,其實也就是驗證碼了。這種ip的話就是算不可用的。

固然,還有超時、不可鏈接等等的狀況。

validator的代碼相似下面這樣:

def validate_lianjia(proxy_url):
    proxies = {"http": proxy_url} 
    try:
        resp = requests.get("http://bj.lianjia.com/", proxies=proxies, timeout=20) # 20秒超時
        content = resp.decode("utf-8")
        if "請點擊倒着的房屋" in content:
            return False
        else:
            return True
    except:
        return False
複製代碼

代理ip池運行流程

有了validator,咱們就能夠拿買來或者爬來的代理ip去驗證了。若是validator返回爲true,就是可用的。咱們把可用的ip放到「池子」裏,這個「池子」能夠是數據庫,也能夠是本地文件。只要爬蟲程序能拿到就行了。

固然,咱們會有一些更新策略,好比說多久判斷一次池子裏面的代理。是否要剔除池子裏的數據。

這塊咱們就不深刻展開了。

開源代理ip池

固然也有開發者開發的免費代理ip池,其實就是先去各大代理ip網站爬一些代理來,而後再驗證,提供一個Http的接口。

好比說這個:github.com/awolfly9/IP…。當時筆者在大學的時候想爬鏈家,可是不捨得買代理ip,而後就用的這個庫搞的代理ip爬的連接網的房價數據。

一個簡單粗暴的方法:adsl服務器

自我感受代理ip仍是一種比較麻煩的方法,下面介紹的adsl服務器就會很簡單粗暴了。

adsl服務器其實就是撥號上網服務器,它每撥一次號,就獲取一個新的IP。

因此,在adsl服務器上換ip的話,就像下面同樣,兩行代碼搞定。

import os

os.system("ifdown ppp0")  # 先斷網
os.system("ifup ppp0")    # 再聯網
複製代碼

由於每次換ip都須要斷網而後再聯網。因此若是是併發的爬蟲,在adsl服務器上會變得很難管理。若是咱們的爬蟲是單線程爬取的,adsl服務器的體驗仍是不錯的。

若是想體驗adsl服務器,最好本身租一個月練練手就知道怎麼用了,通常價格在100之內/每個月。

相關文章
相關標籤/搜索