1 網絡爬蟲_設置代理服務器


書目參考:精通Python網絡爬蟲和Python3網絡爬蟲實戰。
這里只給出正確的代碼。

首先,代理服務器ip的網址是:http://www.xicidaili.com/。這里面有大量的失效IP地址。

其次, http://httpbin.org/get或者https開通的網址可以對是否設置成功進行驗證。

實際代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 11 15:54:09 2018

@author: a
"""

#設置正確的代理服務器
from urllib.error import URLError
def use_proxy(proxy_addr,url):
    import urllib.request
    #proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr,"https":"https://"+proxy_addr})
    proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr})
    headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400")
opener=urllib.request.build_opener(proxy)
    opener.addheaders=[headers]
    #print (opener.open(url).getheaders())
    #print (opener.open(url).info())   
    try:
        response=opener.open(url)
        data=response.read().decode('utf-8')
        print(data) 
    except URLError as e:
        print("出現異常")
        print(e.reason)
    return data
#獲取本機ip地址
import socket
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
print ("本機電腦名:",hostname)
print ("本機Ip:",ip)
proxy_addr="101.236.35.98:8866"
data=use_proxy(proxy_addr,"http://httpbin.org/get")
#print (data)
print (len(data))

#也可以opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)

#也可以注冊opener。

       urllib.request.install_opener(opener)

            response=urllib.request.urlopen(url)

為了確定是否使用的是代理服務器的ip地址,可以將目標url設為: http://httpbin.org/get因為該服務器的response會專門返回客戶端使用的ip地址。可以看到:

runfile('G:/精通python網絡爬蟲/6 代理服務器設置_2.py', wdir='G:/精通python網絡爬蟲')

本機電腦名: DESKTOP-090FKDS

本機Ip: 192.168.8.100

{"args":{},"headers":{"Accept-Encoding":"identity","Cache-Control":"max-age=259200","Connection":"close","Host":"httpbin.org","User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400"},"origin":"101.236.35.98","url":"http://httpbin.org/get"}

352

幾個錯誤

第一個錯誤

Python3網絡爬蟲實戰書中的錯誤是:設置Proxyhandler的時候使用的是:

#proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr,"https":"https://"+proxy_addr})

即將http和https都設置了。但是這樣總是會出現各種問題。

其中,http://www.xicidaili.com/對於各種類型的代理IP是有嚴格分類的。如果訪問http的網址,就用國內http代理IP即可。

第二個錯誤

寫代碼的時候沒有注意,反復open(url)就會導致報錯。

    print (opener.open(url).getheaders())

    print (opener.open(url).info())  

    data=opener.open(url).read().decode('utf-8')

    print(data)

    return data

第三個錯誤

如果設置的代理是http類型的,訪問的是https的網址。這個時候,代理是不起任何作用的。比如,有效的http代理服務器ip是:102.236.35.98:8866。這個時候,你隨便改動IP,使用下面的代碼,都能正常跑通。

def use_proxy(proxy_addr,url):
    import urllib.request
    proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr})
    print (proxy_addr)
    headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400")
    opener=urllib.request.build_opener(proxy)
    opener.addheaders=[headers]                                                                                                                                                                                                                                                   
    data=opener.open(url).read().decode('utf-8')
    print (data)
    return data
#獲取本機ip地址
import socket
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
print ("本機電腦名:",hostname)
print ("本機Ip:",ip)
#proxy_addr="101.236.35.98:8866"
proxy_addr="104.236.35.98:8866"#隨便改動ip地址。
data=use_proxy(proxy_addr,"https://www.baidu.com")
#print (data)
print (len(data))

為了驗證一下ip地址沒有起到任何作用。我們修改url為:https://httpbin.org/get

因為這個url的response是客戶端的ip地址,可以看到結果如下:

可以看到本機的ip是192.168.8.100,設置的代理服務器的ip是

104.236.35.98:8866,而服務器端記錄的客戶端的ip地址是:117.61.138.21.
你繼續改動代理服務器的ip地址:可以看到,服務器端記錄的客戶端ip地址仍然是:117.61.138.21

為什么117.61.138.21和我的本機ip不一樣呢。

這是因為我的電腦連接的是wifi熱點。所以服務器實際記錄的客戶端ip地址就不是我的電腦顯示的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM