程序員的自我救贖,python秒解技能。

無私分享全套Python爬蟲乾貨,如果你也想學習Python,@ 私信小編獲取

在使用python爬蟲的時候,經常會遇見所要爬取的網站採取了反爬取技術,高強度、高效率地爬取網頁信息常常會給網站服務器帶來巨大壓力,所以同一個IP反覆爬取同一個網頁,就很可能被封,那如何解決呢?使用代理ip,設置代理ip池。

一.主要思路

  • 從代理ip網站爬取IP地址及端口號並儲存
  • .驗證ip是否能用

二.代碼

  • 配置環境,導入包
<code>from bs4 import BeautifulSoup
import requests
import random
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/<code>
  • 獲取網頁內容函數
<code>def getHTMLText(url,proxies):
try:
r = requests.get(url,proxies=proxies)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
return 0
else:
return r.text/<code>
  • 代理測試,並檢測可用性
<code># -*- coding: utf-8 -*-
import random
import requests
from proxy_util import logger
from run import fifo_queue
from settings import USER_AGENT_LIST
from proxy_util import base_headers
# 測試地址
url = 'http://icanhazip.com'
# 獲取代理
proxy = fifo_queue.pop(schema='http')
proxies = {proxy.schema:proxy._get_url()}
# 構造請求頭
headers = dict(base_headers)
if 'User-Agent' not in headers.keys():
headers['User-Agent'] = random.choice(USER_AGENT_LIST)
response = None
successed = False
try:
response = requests.get(url,headers=headers,proxies = proxies,timeout=5)
except BaseException:
logger.error("使用代理< "+proxy._get_url()+" > 請求 < "+url+" > 結果: 失敗 ")
else:
if (response.status_code == 200):
logger.info(response.content.decode())
successed = True
logger.info("使用代理< " + proxy._get_url() + " > 請求 < " + url + " > 結果: 成功 ")
else:
logger.info(response.content.decode())
logger.info("使用代理< " + proxy._get_url() + " > 請求 < " + url + " > 結果: 失敗 ")
# 根據請求的響應結果更新代理
proxy._update(successed)
# 將代理返還給隊列,返還時不校驗可用性
fifo_queue.push(proxy,need_check=False)/<code>

無私分享全套Python爬蟲乾貨,如果你也想學習Python,@ 私信小編獲取


程序員的自我救贖,python秒解技能。


分享到:


相關文章: