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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

爬虫代理

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

花了幾天時間寫了一個比較完整的爬蟲代理模塊,基本上實現了一個比較完整的代理系統。

有如下幾大模塊:

  • ip的獲取模塊
  • 檢驗及刪除更新
  • requests循環請求

ip的獲取

ip來源:http://www.xicidaili.com/wt/
通過遍歷西刺代理中的四個頁面獲取ip,然后對ip有效性進行檢驗,將有效的ip寫入文件。這里需要注意一下,西刺代理有效的ip一般都在前面,后面基本都是失效了的,我選擇每個頁面的前30條ip地址來檢驗,后面的直接舍棄。

#http://www.xicidaili.com/wt/def get_goubanjia(self,url_target):try:#設置headersheaders = {'User-Agent':str(UserAgent().random)}#發送requests請求req = requests.get(url_target,headers=headers, timeout=5)#校正網頁編碼req.encoding = req.apparent_encoding#對網頁進行解析soup = BeautifulSoup(req.text, 'lxml')tr_list = soup.find_all('tr')for each in range(1, 31):print('已經篩選了{}條ip'.format(each))print("獲取地址")#獲取地址td = tr_list[each].find_all('td')a = td[1].get_text()print("獲取端口")#獲取端口b = td[2].get_text()#將有效的ip寫入文件proxy = 'http://' + a+':'+b#檢驗ip是否有效,將有效的ip寫入文件當中if self.verifyIP(proxy):f = open('ip.txt','a+',encoding='utf-8')f.write(proxy+'\n')f.close()#輸出爬取到的信息print(proxy)except Exception as e:print(str(e))print('{}:網站頁面發生變動,請及時更新'.format(url_target))

ip的檢驗

通過傳入的proxy(‘http://123.123.123’),利用需要爬取的網站作為目標網站,發送requests請求來實現ip有效性的檢驗。
在檢驗ip有效性的過程中,我發現了這樣一個有趣的現象,同一批ip對不同網站的訪問速度不同(排除了網站本身的訪問速度原因)。打個比方,有A、B兩個網站他們的服務器配置是一樣的,但是a、b、c、d四個ip從發送請求到相應這中間的時間卻是不一樣的。
所以,建議檢驗ip有效性時采用目標網站比較合適

#驗證ip,返回True/False值def verifyIP(self,proxy):print('開始判斷{}的有效性'.format(proxy))try:#設置ipproxies = {'{}'.format(self.ip_stype):proxy}#設置headersheaders = {'User-Agent':str(UserAgent().random)}#發生requests請求req = requests.get(self.url, headers=headers, proxies=proxies, verify=False, timeout=(6,14))except Exception as e:print('{}代理ip無效'.format(proxies))print('在檢驗過程中遇到的requests錯誤原因是:{}'.format(e))return Falseelse:print('{}代理ip有效'.format(proxies))return Truefinally:print('{}代理ip有效性判斷完成'.format(proxies))

刪除ip

刪除ip這塊相對而言簡單一些,讀取文件–>刪除舊文件–>刪除ip列表中的失效ip–>將ip列表寫入文件。

#刪除proxydef deleteProxy(self,proxy):print('刪除無效proxy:{}'.format(proxy))f = open('ip.txt', 'r', encoding='utf-8')proxy_list = f.readlines()f.close()#刪除列表中的換行符號proxy_list = [proxy.replace('\n','') for proxy in proxy_list]#刪除原文件os.remove('ip.txt')#刪除指定的proxyproxy_list.remove(proxy)#當文件為空時,重新下載文件if len(proxy_list)==0:print('現在列表為空,我們將重新獲取ip')#調用父類下載新的ip文件super().getIpFile()#將信息重新寫入文件f = open('ip.txt', 'a+', encoding='utf-8')for each in proxy_list:f.write(each+'\n')f.close()

ip文件的自動更新機制

簡單點來說就是在刪除失效ip后檢測文件是否為空,為空時,再次從互聯網上下載一批新的ip

#刪除指定的proxyproxy_list.remove(proxy)#當文件為空時,重新下載文件if len(proxy_list)==0:print('現在列表為空,我們將重新獲取ip')#調用父類下載新的ip文件super().getIpFile()

requests循環請求

利用while構造一個死循環,只有在requests請求成功時,打破死循環的代碼(flag=False)才會被執行,當然每一次循環都會采用新的IP地址以及headers

flag=True while (flag!=False):try:try:#設置代理ipproxy = self.createRandomIp()#設置proxiesproxies = {'{}'.format(self.ip_stype):proxy}#設置代理headersheaders = {'User-Agent':str(UserAgent().random)}req = requests.get(self.url, proxies=proxies, headers=headers, verify=False, timeout=(9,21))flag=Falseexcept Exception as e:print('上一次請求失敗,10秒后我們將進行下一次請求')print("上一次requests請求失敗的原因是{}".format(e))print('上一次請求的代理ip為:{}'.format(proxy))time.sleep(10)#驗證proxy的有效性,并對無效proxy進行處理proxy = self.verifyProxy(proxy)#設置proxiesproxies = {'{}'.format(self.ip_stype):proxy}#設置代理headersheaders = {'User-Agent':str(UserAgent().random)}req = requests.get(self.url, proxies=proxies, headers=headers, verify=False, timeout=(9,21))flag=Falseexcept:pass

備注

考慮到短時間多次訪問一個網站可能會被識別出來,故在第一次發送requests請求時是不檢驗ip的有效性,如果請求出錯則10秒后會對該ip進行驗證,中間間隔10秒是考慮到網絡信號的影響。如果檢驗到ip失效則會將其從ip文件中刪除。

在刪除失效ip后,會重新分配一個ip并對其有效性進行檢驗,無效則刪除,重新分配ip直至分配的ip通過檢驗,采用的是遞歸算法。

在requests請求這一塊,也具有相同的思想,不斷發送requests請求直至成功,采用while構造死循環。

總結

以上是生活随笔為你收集整理的爬虫代理的全部內容,希望文章能夠幫你解決所遇到的問題。

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