程序员的自我救赎,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秒解技能。


分享到:


相關文章: