国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【蟲術(shù)】資深爬蟲師帶你爬取代理IP

PiscesYE / 3053人閱讀

摘要:返回結(jié)果如下,接下來我們便開始爬取西刺代理,首先我們打開瀏覽器查看網(wǎng)頁,并找到和端口元素的信息。爬取代理地址,代理的是西刺代理去掉可能重復(fù)的等待秒將要爬取頁數(shù)的爬取好后存入數(shù)組,然后再對其中的逐一測試。

有時候在網(wǎng)站看小說,會莫名跳出來一個“疑似機(jī)器惡意爬取,暫時無法訪問”這樣類似的網(wǎng)站提示,需要刷新一下或者輸入一個驗(yàn)證碼才能重新進(jìn)入,這樣的情況偶有發(fā)生,相信大家都有遇到過。出現(xiàn)這個現(xiàn)象的原因就是我們?yōu)g覽的網(wǎng)頁采取了反爬蟲的措施,特別做爬蟲爬取網(wǎng)頁,在某個ip單位時間請求網(wǎng)頁次數(shù)過多時,服務(wù)器會拒絕服務(wù),這種情況就是由于訪問頻率引起的封ip,這種情況靠解封不能很好的解決,所以我們就想到了偽裝本機(jī)ip去請求網(wǎng)頁,也就是我們今天要講的使用代理ip。

目前網(wǎng)上有許多代理ip,有免費(fèi)的也有付費(fèi)的,例如西刺代理,豌豆代理,快代理等等,免費(fèi)的雖然不用花錢但有效的代理很少且不穩(wěn)定,付費(fèi)的可能會好一點(diǎn),不過今天我只爬取免費(fèi)的西刺代理并將檢測是否可用,將可用ip存入MongoDB,方便下次取出。

運(yùn)行平臺:Windows

Python版本:Python3.6

IDE: Sublime Text

其他:Chrome瀏覽器

簡述流程為:

步驟1:了解requests代理如何使用

步驟2:從西刺代理網(wǎng)頁爬取到ip和端口

步驟3:檢測爬取到的ip是否可用

步驟4:將爬取的可用代理存入MongoDB

步驟5:從存入可用ip的數(shù)據(jù)庫里隨機(jī)抽取一個ip,測試成功后返回

對于requests來說,代理的設(shè)置比較簡單,只需要傳入proxies參數(shù)即可。

不過需要注意的是,這里我是在本機(jī)安裝了抓包工具Fiddler,并用它在本地端口8888創(chuàng)建了一個HTTP代理服務(wù)(用Chrome插件SwitchyOmega),即代理服務(wù)為:127.0.0.1:8888,我們只要設(shè)置好這個代理,就可以成功將本機(jī)ip切換成代理軟件連接的服務(wù)器ip了。

import requests

proxy = "127.0.0.1:8888"
proxies = {
    "http":"http://" + proxy,
    "https":"http://" + proxy
}

try:
    response = requests.get("http://httpbin.org/get",proxies=proxies)
    print(response.text)
except requests.exceptions.ConnectionError as e:
    print("Error",e.args)

這里我是用來http://httpbin.erg/get作為測...,我們訪問該網(wǎng)頁可以得到請求的有關(guān)信息,其中origin字段就是客戶端ip,我們可以根據(jù)返回的結(jié)果判斷代理是否成功。返回結(jié)果如下:

{

"args":{},
"headers":{
    "Accept":"*/*",
    "Accept-Encoding":"gzip, deflate",
    "Connection":"close",
    "Host":"httpbin.org",
    "User-Agent":"python-requests/2.18.4"
},
"origin":"xx.xxx.xxx.xxx",
"url":"http://httpbin.org/get"

}

接下來我們便開始爬取西刺代理,首先我們打開Chrome瀏覽器查看網(wǎng)頁,并找到ip和端口元素的信息。

可以看到,西刺代理以表格存儲ip地址及其相關(guān)信息,所以我們用BeautifulSoup提取時很方便便能提取出相關(guān)信息,但是我們需要注意的是,爬取的ip很有可能出現(xiàn)重復(fù)的現(xiàn)象,尤其是我們同時爬取多個代理網(wǎng)頁又存儲到同一數(shù)組中時,所以我們可以使用集合來去除重復(fù)的ip。

27def scrawl_xici_ip(num):
 28    """
 29    爬取代理ip地址,代理的url是西刺代理
 30    """  
 31    ip_list = []
 32    for num_page in range(1,num):
 33        url = url_ip + str(num_page)
 34        response = requests.get(url,headers=headers)
 35        if response.status_code == 200:
 36            content = response.text
 37            soup = BeautifulSoup(content,"lxml")
 38            trs = soup.find_all("tr")
 39            for i in range(1,len(trs)):
 40                tr = trs[i]
 41                tds = tr.find_all("td")      
 42                ip_item = tds[1].text + ":" + tds[2].text
 43                # print(ip_item)
 44                ip_list.append(ip_item)
 45                ip_set = set(ip_list) # 去掉可能重復(fù)的ip
 46                ip_list = list(ip_set)
 47            time.sleep(count_time) # 等待5秒
 48    return ip_list

將要爬取頁數(shù)的ip爬取好后存入數(shù)組,然后再對其中的ip逐一測試。

 51def ip_test(url_for_test,ip_info):
 52    """
 53    測試爬取到的ip,測試成功則存入MongoDB
 54    """
 55    for ip_for_test in ip_info:
 56        # 設(shè)置代理
 57        proxies = {
 58            "http": "http://" + ip_for_test,
 59            "https": "http://" + ip_for_test,
 60            }
 61        print(proxies)
 62        try:
 63            response = requests.get(url_for_test,headers=headers,proxies=proxies,timeout=10)
 64            if response.status_code == 200:
 65                ip = {"ip":ip_for_test}
 66                print(response.text)
 67                print("測試通過")
 68                write_to_MongoDB(ip)    
 69        except Exception as e:
 70            print(e)
 71            continue

這里就用到了上面提到的requests設(shè)置代理的方法,我們使用http://httpbin.org/ip作為測試...,它可以直接返回我們的ip地址,測試通過后再存入MomgoDB數(shù)據(jù)庫。

存入MongoDB的方法在上一篇糗事百科爬取已經(jīng)提過了。連接數(shù)據(jù)庫然后指定數(shù)據(jù)庫和集合,再將數(shù)據(jù)插入就OK了。

 74def write_to_MongoDB(proxies):
 75    """
 76    將測試通過的ip存入MongoDB
 77    """
 78    client = pymongo.MongoClient(host="localhost",port=27017)
 79    db = client.PROXY
 80    collection = db.proxies
 81    result = collection.insert(proxies)
 82    print(result)
 83    print("存儲MongoDB成功")

最后運(yùn)行查看一下結(jié)果吧

如果對Python編程、網(wǎng)絡(luò)爬蟲、機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、web開發(fā)、人工智能、面試經(jīng)驗(yàn)交流。感興趣可以519970686,群內(nèi)會有不定期的發(fā)放免費(fèi)的資料鏈接,這些資料都是從各個技術(shù)網(wǎng)站搜集、整理出來的,如果你有好的學(xué)習(xí)資料可以私聊發(fā)我,我會注明出處之后分享給大家。

稍等,運(yùn)行了一段時間后,難得看到一連三個測試通過,趕緊截圖保存一下,事實(shí)上是,畢竟是免費(fèi)代理,有效的還是很少的,并且存活時間確實(shí)很短,不過,爬取的量大,還是能找到可用的,我們只是用作練習(xí)的話,還是勉強(qiáng)夠用的?,F(xiàn)在看看數(shù)據(jù)庫里存儲的吧。

因?yàn)榕廊〉捻摂?shù)不多,加上有效ip也少,再加上我沒怎么爬,所以現(xiàn)在數(shù)據(jù)庫里的ip并不多,不過也算是將這些ip給存了下來?,F(xiàn)在就來看看怎么隨機(jī)取出來吧。

 85
 86def get_random_ip():
 87    """
 88    隨機(jī)取出一個ip
 89    """
 90    client = pymongo.MongoClient(host="localhost",port=27017)
 91    db = client.PROXY
 92    collection = db.proxies
 93    items = collection.find()
 94    length = items.count()
 95    ind = random.randint(0,length-1)
 96    useful_proxy = items[ind]["ip"].replace("
","")
 97    proxy = {
 98        "http": "http://" + useful_proxy,
 99        "https": "http://" + useful_proxy,
100        }   
101    response = requests.get(url_for_test,headers=headers,proxies=proxy,timeout=10)
102    if response.status_code == 200:
103        return useful_proxy
104    else:
105        print("此{(lán)ip}已失效".format(useful_proxy))
106        collection.remove(useful_proxy)
107        print("已經(jīng)從MongoDB移除")
108        get_random_ip()
109

由于擔(dān)心放入數(shù)據(jù)庫一段時間后ip會失效,所以取出前我重新進(jìn)行了一次測試,如果成功再返回ip,不成功的話就直接將其移出數(shù)據(jù)庫。

這樣我們需要使用代理的時候,就能通過數(shù)據(jù)庫隨時取出來了。

總的代碼如下:

import random
import requests
import time
import pymongo
from bs4 import BeautifulSoup

# 爬取代理的URL地址,選擇的是西刺代理
url_ip = "http://www.xicidaili.com/nt/"

# 設(shè)定等待時間
set_timeout = 5

# 爬取代理的頁數(shù),2表示爬取2頁的ip地址
num = 2

# 代理的使用次數(shù)
count_time = 5

# 構(gòu)造headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"}

# 測試ip的URL
url_for_test = "http://httpbin.org/ip"

def scrawl_xici_ip(num):
    """
    爬取代理ip地址,代理的url是西刺代理
    """  
    ip_list = []
    for num_page in range(1,num):
        url = url_ip + str(num_page)
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            content = response.text
            soup = BeautifulSoup(content,"lxml")
            trs = soup.find_all("tr")
            for i in range(1,len(trs)):
                tr = trs[i]
                tds = tr.find_all("td")      
                ip_item = tds[1].text + ":" + tds[2].text
                # print(ip_item)
                ip_list.append(ip_item)
                ip_set = set(ip_list) # 去掉可能重復(fù)的ip
                ip_list = list(ip_set)
            time.sleep(count_time) # 等待5秒
    return ip_list

def ip_test(url_for_test,ip_info):
    """
    測試爬取到的ip,測試成功則存入MongoDB
    """
    for ip_for_test in ip_info:
        # 設(shè)置代理
        proxies = {
            "http": "http://" + ip_for_test,
            "https": "http://" + ip_for_test,
            }
        print(proxies)
        try:
            response = requests.get(url_for_test,headers=headers,proxies=proxies,timeout=10)
            if response.status_code == 200:
                ip = {"ip":ip_for_test}
                print(response.text)
                print("測試通過")
                write_to_MongoDB(ip)    
        except Exception as e:
            print(e)
            continue

def write_to_MongoDB(proxies):
    """
    將測試通過的ip存入MongoDB
    """
    client = pymongo.MongoClient(host="localhost",port=27017)
    db = client.PROXY
    collection = db.proxies
    result = collection.insert(proxies)
    print(result)
    print("存儲MongoDB成功")

def get_random_ip():
    """
    隨機(jī)取出一個ip
    """
    client = pymongo.MongoClient(host="localhost",port=27017)
    db = client.PROXY
    collection = db.proxies
    items = collection.find()
    length = items.count()
    ind = random.randint(0,length-1)
    useful_proxy = items[ind]["ip"].replace("
","")
    proxy = {
        "http": "http://" + useful_proxy,
        "https": "http://" + useful_proxy,
        }   
    response = requests.get(url_for_test,headers=headers,proxies=proxy,timeout=10)
    if response.status_code == 200:
        return useful_proxy
    else:
        print("此{(lán)ip}已失效".format(useful_proxy))
        collection.remove(useful_proxy)
        print("已經(jīng)從MongoDB移除")
        get_random_ip()

def main():
    ip_info = []
    ip_info = scrawl_xici_ip(2)
    sucess_proxy = ip_test(url_for_test,ip_info)
    finally_ip = get_random_ip()
    print("取出的ip為:" + finally_ip)

if __name__ == "__main__":
    main()

【給技術(shù)人一點(diǎn)關(guān)愛?。。 ?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44854.html

相關(guān)文章

  • 蟲術(shù)資深爬蟲師帶你爬取代IP

    摘要:返回結(jié)果如下,接下來我們便開始爬取西刺代理,首先我們打開瀏覽器查看網(wǎng)頁,并找到和端口元素的信息。爬取代理地址,代理的是西刺代理去掉可能重復(fù)的等待秒將要爬取頁數(shù)的爬取好后存入數(shù)組,然后再對其中的逐一測試。 有時候在網(wǎng)站看小說,會莫名跳出來一個疑似機(jī)器惡意爬取,暫時無法訪問這樣類似的網(wǎng)站提示,需要刷新一下或者輸入一個驗(yàn)證碼才能重新進(jìn)入,這樣的情況偶有發(fā)生,相信大家都有遇到過。出現(xiàn)這個現(xiàn)象的...

    learning 評論0 收藏0
  • 【Python爬蟲】手把手帶你爬下肯德基官網(wǎng)(ajax的post請求)

    摘要:準(zhǔn)備工作查看肯德基官網(wǎng)的請求方法請求。判斷得肯德基官網(wǎng)是請求通過這兩個準(zhǔn)備步驟,明確本次爬蟲目標(biāo)的請求肯德基官網(wǎng)獲取上??系禄攸c(diǎn)前頁。構(gòu)造不難發(fā)現(xiàn),肯德基官網(wǎng)的的一個共同點(diǎn),我們把它保存為。 ...

    WelliJhon 評論0 收藏0
  • K3s初探:Rancher架構(gòu)帶你嘗鮮史上最輕量Kubernetes發(fā)行版

    摘要:發(fā)布不到兩天,上數(shù)已近,這個業(yè)界大熱的史上最輕量的開源發(fā)行版,你試過了沒資深架構(gòu)師來教你走出嘗鮮第一步使用教程在此前言昨天,正式發(fā)布了一款史上最輕量的開源發(fā)行版。大小只有,極簡,輕便,易于使用。 發(fā)布不到兩天,GitHub上Star數(shù)已近3000,這個業(yè)界大熱的、史上最輕量的開源Kubernetes發(fā)行版,你試過了沒? Rancher資深架構(gòu)師來教你走出嘗鮮第一步!使用教程在此! sh...

    neuSnail 評論0 收藏0
  • 精通Python網(wǎng)絡(luò)爬蟲(0):網(wǎng)絡(luò)爬蟲學(xué)習(xí)路線

    摘要:以上是如果你想精通網(wǎng)絡(luò)爬蟲的學(xué)習(xí)研究路線,按照這些步驟學(xué)習(xí)下去,可以讓你的爬蟲技術(shù)得到非常大的提升。 作者:韋瑋 轉(zhuǎn)載請注明出處 隨著大數(shù)據(jù)時代的到來,人們對數(shù)據(jù)資源的需求越來越多,而爬蟲是一種很好的自動采集數(shù)據(jù)的手段。 那么,如何才能精通Python網(wǎng)絡(luò)爬蟲呢?學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲的路線應(yīng)該如何進(jìn)行呢?在此為大家具體進(jìn)行介紹。 1、選擇一款合適的編程語言 事實(shí)上,Python、P...

    spacewander 評論0 收藏0

發(fā)表評論

0條評論

PiscesYE

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<