python爬虫遇到IP被封的情况,怎么办?

代理服务的介绍:

  • 我们在做爬虫的过程中经常最初爬虫都正常运行,正常爬取数据,一切看起来都是美好,然而一杯茶的功夫就出现了错误。
  • 如:403 Forbidden错误,“您的IP访问频率太高”错误,或者跳出一个验证码让我们输入,之后解封,但过一会又出现类似情况。
  • 出现这个现象的原因是因为网站采取了一些反爬中措施,如:服务器检测IP在单位时间内请求次数超过某个阀值导致,称为封IP。
  • 为了解决此类问题,代理就派上了用场,如:代理软件、付费代理、ADSL拨号代理,以帮助爬虫脱离封IP的苦海。
  • 测试HTTP请求及响应的网站:http://httpbin.org/
  • GET地址 :http://httpbin.org/get
  • POST地址:http://httpbin.org/post
  • httpbin这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等.
  • 且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。
  • 它用 Python + Flask 编写,是一个开源项目。开源地址:https://github.com/Runscope/httpbin
  • 返回信息中origin的字段就是客户端的IP地址,即可判断是否成功伪装IP:

代理的设置:

① urllib的代理设置

 1  from urllib.error import URLError
 2  from urllib.request import ProxyHandler, build_opener
 3  
 4  proxy = '127.0.0.1:8888'
 5  #需要认证的代理
 6  #proxy = 'username:password@127.0.0.1:8888'
 7  
 8  #使用ProxyHandler设置代理
 9  proxy_handler = ProxyHandler({
10   'http': 'http://' + proxy,
11   'https': 'https://' + proxy
12  })
13  #传入参数创建Opener对象
14  opener = build_opener(proxy_handler)
15  try:
16   response = opener.open('http://httpbin.org/get')
17   print(response.read().decode('utf-8'))
18  except URLError as e:
19   print(e.reason)

② requests的代理设置

 1  import requests
 2  
 3  proxy = '127.0.0.1:8888'
 4  #需要认证的代理
 5  #proxy = 'username:password@127.0.0.1:8888'
 6  
 7  proxies = {
 8   'http': 'http://' + proxy,
 9   'https': 'https://' + proxy,
10  }
11  try:
12   response = requests.get('http://httpbin.org/get', proxies=proxies)
13   print(response.text)
14  except requests.exceptions.ConnectionError as e:
15   print('Error', e.args)

③ Selenium的代理使用

  • 使用的是PhantomJS
 1  from selenium import webdriver
 2  
 3  service_args = [
 4   '--proxy=127.0.0.1:9743',
 5   '--proxy-type=http',
 6   #'--proxy-auth=username:password' #带认证代理
 7  ]
 8  
 9  browser = webdriver.PhantomJS(service_args=service_args)
10  browser.get('http://httpbin.org/get')
11  print(browser.page_source)
  • 使用的是Chrome
1  from selenium import webdriver
2  
3  proxy = '127.0.0.1:9743'
4  chrome_options = webdriver.ChromeOptions()
5  chrome_options.add_argument('--proxy-server=http://' + proxy)
6  chrome = webdriver.Chrome(chrome_options=chrome_options)
7  chrome.get('http://httpbin.org/get')

④ 在Scrapy使用代理

1  #在Scrapy的Downloader Middleware中间件里
2   ...
3   def process_request(self, request, spider):
4   request.meta['proxy'] = 'http://127.0.0.1:9743'
5   ...

免费代理IP的使用

我们可以从互联网中获取免费的代理IP:如:西刺

 1  import requests,random
 2  
 3  #定义代理池
 4  proxy_list = [
 5   '182.39.6.245:38634',
 6   '115.210.181.31:34301',
 7   '123.161.152.38:23201',
 8   '222.85.5.187:26675',
 9   '123.161.152.31:23127',
10  ]
11  
12  # 随机选择一个代理
13  proxy = random.choice(proxy_list)
14  
15  proxies = {
16   'http': 'http://' + proxy,
17   'https': 'https://' + proxy,
18  }
19  try:
20   response = requests.get('http://httpbin.org/get', proxies=proxies)
21   print(response.text)
22  except requests.exceptions.ConnectionError as e:
23   print('Error', e.args)
24  

 

收费代理IP的使用

收费代理还是很多的如:

  • 西刺
  • 讯代理
  • 快代理
  • 大象代理

在requests中使用收费代理

 1  import requests
 2  
 3  # 从代理服务中获取一个代理IP
 4  proxy = requests.get("http://tvp.daxiangdaili.com/ip/?tid=559775358931681&num=1").text
 5  proxies = {
 6   'http': 'http://' + proxy,
 7   'https': 'https://' + proxy,
 8  }
 9  try:
10   response = requests.get('http://httpbin.org/get', proxies=proxies)
11   print(response.text)
12  except requests.exceptions.ConnectionError as e:
13   print('Error', e.args)

​​​​​​

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值