Python爬虫-代理ip池建立
生活随笔
收集整理的這篇文章主要介紹了
Python爬虫-代理ip池建立
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代理IP池建立
前言
之前提到過urllib和requests的利用代理ip的訪問方式 。
- https://blog.csdn.net/zhouchen1998/article/details/81318300
- https://blog.csdn.net/zhouchen1998/article/details/81479092
緣由
但是為什么我們要使用代理ip?
- 因為利用爬蟲這樣的網絡機器人去毫無代價的爬取網站信息不僅不道德還會給對方的服務器帶來巨大負擔,盡管存在著“爬蟲道德”不過這也是有素質的人的自我遵守,沒有什么約束力。對此網站的反爬蟲策略一直沒有停止過,其中一個手段就是判斷你的網頁操作是不是人,如果是多次頻繁爬取的機器人那么屬于你機器的唯一身份ip地址就會被對方封禁,你將不能訪問該網站。
而針對這種措施,其中比較行之有效的方法就是我不使用自己的ip直接訪問,而是使用一個虛假的代理身份去訪問,一旦被封我只需要換個ip就好,不會干擾我的正常使用。
網址
提供代理服務器獲取的常用網站地址如下,后續可能不可用。
- www.xicidaili.com(西刺代理)
- www.goubanjia.com(goubanjia)
這里很多短時間的免費的,對于玩玩爬蟲的可以使用,如果你是專業的爬蟲工程師那么建議你購買相關的代理服務。
代理IP池
前面我們已經介紹了兩種常用的訪問模塊的代理使用方法,但是每次使用都要到網站中去找到一個合適的,這很不方便,看了一些博客決定建立一個模塊作為代理ip的自動獲取-代理ip池。
我們想要實現的功能是,只要在需要的時候導入這個模塊調用get方法就會得到一個可用的ip代理地址。
這里的代理ip池是獲取的goubanjia上的最新20個代理ip足夠爬蟲愛好者使用,專業爬蟲工程師可以購買服務,爬取更多內容。
步驟
經過元素的審查分析,可以通過元素定位和拼接得到20個ip地址。
但是有三個難點:
- 1:觀察源代碼出現這樣的前后一樣數值但是屬性為不顯示的干擾性,在獲得源碼并定位標簽的基礎上利用正則表達式替換掉了這樣的p標簽為空字符。如<p style="display: none;">5</p>。
- 2: 還有一個難點是如果使用的urllib或者是requests模塊那么最后的端口號是沒有js加載前的,是不準確的,這里筆者未選擇進行js代碼研究,而是使用selenium直接獲得js加載后的源碼。
- 3: 即使剔除了干擾項,ip地址還是分立存放的,這里使用xpath的string方法獲得所有的文本合并值。
編碼
import time from bs4 import BeautifulSoup from lxml import etree from selenium import webdriver import re# 獲得一組可能可用的代理ip地址 def getproxy():# 目標地址target_url = "http://www.goubanjia.com/"# 使用谷歌瀏覽器driver = webdriver.Chrome(r'C:\Users\16957\AppData\Local\Google\Chrome\Application\chromedriver.exe')# 等待js加載time.sleep(1)# 訪問地址driver.get(target_url)# 得到html文件target_html = driver.page_source# 建立bs對象bs = BeautifulSoup(target_html, 'html.parser')# 找到了20個存放地址的td標簽rst_etree = bs.find_all(attrs={'class': 'ip'})index = 0addr_list = []# 遍歷每一個tdwhile index < len(rst_etree):rst_etree[index] = str(rst_etree[index])# 用l存放所有網頁分析干擾項的p標簽list_p = re.compile(r'<p.*?>[^<]*?</p>').findall(rst_etree[index])# 將所有p標簽替換為空字符for item in list_p:rst_etree[index] = rst_etree[index].replace(item, "")# 通過etree里的xpath中的string方法獲得ip地址dom = etree.HTML(rst_etree[index])ip_addr = ''ip_addr += dom.xpath("string(.)")addr_list.append(ip_addr)index += 1# 得到最新的代理ip列表return addr_listdef check_ip(ip_list=[]):# 使用request驗證ip可用性import requestsfor item in ip_list:proxies = {"http": item,"https": item}# 如果連接成功,且返回來內容認為ip可用,返回該ip退出循環try:rsp = requests.get("http://www.baidu.com", proxies=proxies)if rsp.text is not None:return itembreakexcept Exception:pass# 如果20個遍歷完沒找到可用的ip,返回nonereturn None# 得到一個可用的ip地址 # 這個函數在其他地方導入該模塊并且執行該函數就會返回一個可用的ip地址 def get_one_proxy_ip():ip_list = getproxy()if check_ip(ip_list) is not None:return check_ip(ip_list)else:return Noneif __name__ == '__main__':print(get_one_proxy_ip())效果
可以看到我拿到了一個可用的代理ip,如果想同時使用多個可以修改源碼或者多次請求該模塊。
補充說明
爬蟲的有效期是比較短的,后期如有問題,歡迎評論區指出。
總結
以上是生活随笔為你收集整理的Python爬虫-代理ip池建立的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划算法-03背包问题
- 下一篇: 时序数据处理工具-时间序列数据特征提取T