日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Requests 和 Scrapy 中的代理 IP 设置

發布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Requests 和 Scrapy 中的代理 IP 设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要: Requests 和 Scrapy 中的代理 IP 設置方法。

目標測試網頁如下,請求該網頁可以返回當前 IP 地址:

∞ http://icanhazip.com

先來說說 Requests 中如何設置代理 IP。

▌不使用代理

先來看一下不使用代理 IP 的情況:

import requests url = 'http://icanhazip.com' try:response = requests.get(url) #不使用代理print(response.status_code)if response.status_code == 200:print(response.text) except requests.ConnectionError as e:print(e.args)

運行上面的程序,會返回我們電腦本機的 IP,可以通過百度查詢 IP 地址對比一下就知道了。

200 124.238.223.xxx # 后三位隱去了 [Finished in 0.8s]

▌使用代理

然后我們測試一下使用代理后的情況。

常見的代理包括 HTTP 代理和 SOCKS5 代理,前者可以找一些免費代理 IP 進行測試,由于我電腦上使用的是 Shadowsocks,所以就介紹一下 SOCKS5 代理的設置。

啟動該軟件后默認會在 1080 端口下創建 SOCKS5 代理服務,代理為:127.0.0.1:1080,然后我們在 Requests 中使用該代理,方法很簡單只需要添加一項 proxies 參數即可:

proxies = [{'http':'socks5://127.0.0.1:1080'},{'https':'socks5://127.0.0.1:1080'} ] proxies = random.choice(proxies) print(proxies) url = 'http://icanhazip.com' try:response = requests.get(url,proxies=proxies) #使用代理print(response.status_code)if response.status_code == 200:print(response.text) except requests.ConnectionError as e:print(e.args)

這里,proxies 參數是字典類型,鍵名'http' 表示協議類型,鍵值 'socks5://127.0.0.1:1080'表示代理,這里添加了 http 和 https 兩個代理,這樣寫是因為有些網頁采用 http 協議,有的則是采用 https 協議,為了在這兩類網頁上都能順利使用代理,所以一般都同時寫上,當然,如果確定了某網頁的請求類型,可以只寫一種,比如這里我們請求的 url 使用的是 http 協議,那么使用 http 代理就可以,random 函數用來隨機選擇一個代理,我們來看一下結果:

{'http': 'socks5://127.0.0.1:1080'} 200 45.78.42.xxx #xxx表示隱去了部分信息

可以看到,這里隨機選擇了 http 協議的代理后,返回的 IP 就是我真實的 IP 代理地址,成功代理后就可以爬一些墻外的網頁了。

延伸一下,假如隨機選擇的是 https 代理,那么返回的 IP 結果還一樣么?我們嘗試重復運行一下上面的程序:

{'https': 'socks5://127.0.0.1:1080'} 200 124.238.223.xxx

可以看到這次使用了 https 代理,返回的 IP 卻是本機的真實 IP,也就是說代理沒有起作用。

進一步地,我們將 url 改為 https 協議 'https://icanhazip.com',然后再嘗試分別用 http 和 https 代理請求,查看一下結果:

#http 請求 {'http': 'socks5://127.0.0.1:1080'} 200 124.238.223.xxx #https 請求 {'https': 'socks5://127.0.0.1:1080'} 200 45.78.42.xxx

可以看到,兩種請求的結果和之前的剛好相反了,由于 url 采用了 https 協議,則起作用的是 https 代理,而 http 代理則不起作用了,所以顯示的是本機 IP。

因此,可以得到這樣的一個結論:

HTTP 代理,只代理 HTTP 網站,對于 HTTPS 的網站不起作用,也就是說,用的是本機 IP。

HTTPS 代理則同理。

▌使用付費代理

上面,我們只使用了一個代理,而在爬蟲中往往需要使用多個代理,那有如何構造呢,這里主要兩種方法:

  • 一種是使用免費的多個 IP;
  • 一種是使用付費的 IP 代理;
  • 免費的 IP 往往效果不好,那么可以搭建 IP 代理池,但對新手來說搞一個 IP 代理池成本太高,如果只是個人平時玩玩爬蟲,完全可以考慮付費 IP,幾塊錢買個幾小時動態 IP,多數情況下都足夠爬一個網站了。

    這里推薦一個付費代理「阿布云代理」,效果好也不貴,如果你不想費勁地去搞 IP 代理池,那不妨花幾塊錢輕松解決。

    首次使用的話,可以選擇購買一個小時的動態版試用下,點擊生成隧道代理信息作為憑證加入到代碼中。

    將信息復制到官方提供的 Requests 代碼中,運行來查看一下代理 IP 的效果:

    import requests # 待測試目標網頁 targetUrl = "http://icanhazip.com" def get_proxies():# 代理服務器proxyHost = "http-dyn.abuyun.com"proxyPort = "9020"# 代理隧道驗證信息proxyUser = "H8147158822SW5CD"proxyPass = "CBE9D1D21DC94189"proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {"host" : proxyHost,"port" : proxyPort,"user" : proxyUser,"pass" : proxyPass,}proxies = {"http" : proxyMeta,"https" : proxyMeta,}for i in range(1,6):resp = requests.get(targetUrl, proxies=proxies)# print(resp.status_code)print('第%s次請求的IP為:%s'%(i,resp.text)) get_proxies()

    可以看到每次請求都會使用不同的 IP,是不是很簡單?比搞 IP 代理池省事多了。

    第1次請求的IP為:125.117.134.158第2次請求的IP為:49.71.117.45第3次請求的IP為:112.244.117.94第4次請求的IP為:122.239.164.35第5次請求的IP為:125.106.147.24[Finished in 2.8s]

    當然,還可以這樣設置:

    """ project = 'Code', file_name = 'lession', author = 'AI悅創' time = '2020/5/26 10:36', product_name = PyCharm, 公眾號:AI悅創 code is far away from bugs with the god animal protectingI love animals. They taste delicious. """ import requests # 112.48.28.233 url = 'http://icanhazip.com' # 下面的 try:......except:......是一個防錯機制 # username:password@代理服務器ip地址:port proxy = {'http':'http://H8147158822SW5CD:CBE9D1D21DC94189@http-dyn.abuyun.com:9020'} try:response = requests.get(url, proxies = proxy)print(response.status_code)if response.status_code == 200:print(response.text) except requests.ConnectionError as e:# 如果報錯,則輸出報錯信息print(e.args)

    以上,介紹了 Requests 中設置代理 IP 的方法,下面我們接著介紹在 Scrapy 中如何設置。

    ▌middlewares.py 中設置

    這種方法需要先在 middlewares.py 中設置代理 IP 中間件:

    import random class ProxyMiddleware(object):def __init__(self, ip):self.ip = ip@classmethoddef from_crawler(cls, crawler):return cls(ip=crawler.settings.get('PROXIES'))def process_request(self, request, spider):ip = random.choice(self.ip)request.meta['proxy'] = iplogging.debug('Using Proxy:%s'%ip)

    接著,需要在 settings.py 添加幾個在西刺上找的代理 IP,格式如下:

    PROXIES = ['https://127.0.0.1:8112', 'https://119.101.112.176:9999','https://119.101.115.53:9999','https://119.101.117.226:9999']

    然后,我們仍然以 "http://icanhazip.com" 為目標網頁,運行 Scrapy 項目重復請求 5 次,查看一下每次返回的 IP 情況:

    def start_requests(self):items = []for i in range(1,6):item = yield scrapy.Request(self.cate_url,callback=self.get_category)items.append(item)return itemsdef get_category(self, response):print(response.text)

    結果如下:

    可以看到部分 IP 成功請求得到了相應,部分 IP 則無效請求失敗,因為這幾個 IP 是免費的 IP,所有失效很正常。

    ▌使用付費代理

    接下來我們使用阿布云付費代理,繼續嘗試一下,在 middlewares.py 中添加下面的代碼:

    """ 阿布云ip代理配置,包括賬號密碼 """ # 阿布云scrapy 寫法 import base64 proxyServer = "http://http-dyn.abuyun.com:9020" proxyUser = "HS77K12Q77V4G9MD" # 購買后點擊生成獲得 proxyPass = "4131FFDFCE27F104" # 購買后點擊生成獲得 # for Python3 proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8") class AbuyunProxyMiddleware(object):""" 阿布云ip代理配置 """def process_request(self, request, spider):request.meta["proxy"] = proxyServerrequest.headers["Proxy-Authorization"] = proxyAuthlogging.debug('Using Proxy:%s'%proxyServer)

    由于,在阿布云購買的是最基礎的代理,即每秒 5 個請求,因為 Scrapy 默認的并發數是 16 個,所以需要對 Scrapy 請求數量進行一下限制,可以設置每個請求的延遲時間為 0.2s ,這樣一秒就剛好請求 5 個,最后啟用上面的代理中間件類即可:

    """ 啟用限速設置 """ AUTOTHROTTLE_ENABLED = True DOWNLOAD_DELAY = 0.2 # 每次請求間隔時間 DOWNLOADER_MIDDLEWARES = {#'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, #啟用隨機UA#'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 100, #啟用隨機UA'wandoujia.middlewares.AbuyunProxyMiddleware': 200, # 啟用阿布云代理#value值越小優先級越高 }

    然后同樣地請求 5 次,查看每次請求返回的 IP :

    可以看到,每個 IP 都順利請求成功了,所以說付費地效果還是好。

    ▌使用 scrapy-proxies 庫代理

    除了上述兩種方法,我們還可以使用 GitHub 上的一個 IP 代理庫:scrapy-proxies,庫的使用方法很簡單, 三個步驟就可以開啟代理 IP。

    首先,運行下面命令安裝好這個庫:

    pip install scrapy_proxies

    然后,在 Scrapy 項目中的 settings.py 文件中,添加下面一段代碼:

    RETRY_TIMES = 3 # 自定義請求失敗重試次數 #重試的包含的錯誤請求代碼 RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408] DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,'scrapy_proxies.RandomProxy': 100,'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, } PROXY_LIST = r'/proxies.txt' # proxy 代理文件存放位置,此處為程序所在磁盤根目錄下 PROXY_MODE = 0 # 每次請求都使用不同的代理

    最后,需要提供多個代理 IP,我們在西刺上隨便找幾個 IP,然后存放在 PROXY_LIST 指定的 txt 文件中即可,格式如下:

    https://119.101.112.176:9999 https://119.101.115.53:9999 https://119.101.117.53:999

    然后重復之前的操作,查看代理 IP 的設置效果。

    我在使用該庫的過程中,發現有一些問題,不知道是配置不對還是怎么回事,效果不是太好,所以推薦使用前兩種方法。

    好,以上就是在 Requests 和 Scrapy 中使用代理 IP 的方法總結,如果爬蟲項目不大、追求穩定且不差錢的話,建議直接上付費代理。

    總結

    以上是生活随笔為你收集整理的Requests 和 Scrapy 中的代理 IP 设置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。