您的位置:首页 > 新闻资讯 >文章内容
如何使用HTTP代理来爬虫?
来源:互联网 作者:admin 时间:2019-11-15 11:02:16

  爬虫程序在抓取部分网站的时候是需要用到代理IP的,比如想要提升爬取速度,IP被禁,网站由于限制无法直接访问等。下面我们来看看如何使用HTTP代理IP。


如何使用HTTP代理来爬虫


  在scrapy中专门提供了HttpProxyMiddleware来给scrapy爬虫设置代理。


  HttpProxyMiddleware默认就是开启的,它会在系统环境变量中搜索当前系统代理,作为scrapy爬虫使用的代理。


  下面是源码解析:


  _get_proxy方法:


  解析代理配置信息,返回身份验证信息以及代理服务器url


  __init__方法:


  在HttpProxyMiddleware的构造器中,使用python标准库urllib中的getproxies函数在系统环境变量中搜索系统代理的相关配置(变量名格式为[格式]_proxy的变量),调用self._get_proxy方法解析代理配置信息,并将其返回结果保存到self.proxies字典中,如果没有找到任何代理配置的话,就抛出NotConfigured异常,HttpProxyMiddleware就会被放弃使用


  process_request方法


  处理每一个待发送的请求,为没有设置过代理的请求(meta属性不包含proxy字段的请求)调用self.set_proxy方法设置代理


  _set_proxy方法


  为一个请求设置代理,以请求的协议(HTTP或者HTTPS)作为键,从代理服务器信息字典self.proxies中选择代理,赋给request.meta的proxy字段。对于身份需要验证的代理服务器,添加HTTP头部Proxy-Authorization,他的值是在_get_proxy方法中计算得到的。


  总结:


  在scrapy中为一个请求设置代理就是将代理服务器的url写到request.meta['proxy']中


  使用多个代理:


  利用HttpProxyMiddleware为爬虫设置代理的时候,对于一种协议(HTTPShuozheHTTP)的所有请求只能使用一个代理,如果想使用多个代理,可以在构造每一个Request对象的时候,通过meta参数的proxy字段手动进行设置


  import scrapy


  from scrapy import Request


  import json


  class XiciSpider(scrapy.Spider):


  name = "xici_proxy"


  allowed_domains = ["www.xicidaili.com"]


  def start_requests(self): #爬取http://www.xicidaili.com/nn/前3 页 foriin range(1, 4):


  yield Request('http://www.xicidaili.com/nn/%s' % i)


  def parse(self, response):


  for sel in response.xpath('//table[@id="ip_list"]/tr[pos


  # 提取代理的IP、port、scheme(http or https)


  ip = sel.css('td:nth-child(2)::text').extract_first()port = sel.css('td:nth-child(3)::text').extract_first()scheme = sel.css('td:nth-child(6)::text').extract_first()


  # 使用爬取到的代理再次发送请求到http(s)://httpbin.org/ip url = '%s://httpbin.org/ip' % scheme


  proxy = '%s://%s:%s' % (scheme, ip, port)


  meta = {


  'proxy': proxy,'dont_retry': True,'download_timeout': 10,


  # 以下两个字段是传递给check_available 方法的信息,方便 '_proxy_scheme': scheme,


  '_proxy_ip': ip,


  }


  yield Request(url, callback=self.check_available, meta=meta, dont_filter=True)


  def check_available(self, response): proxy_ip = response.meta['_proxy_ip']


  # 判断代理是否具有隐藏IP 功能


  if proxy_ip == json.loads(response.text)['origin']:


  yield {


  'proxy_scheme': response.meta['_proxy_scheme'], 'proxy': response.meta['proxy'],


  }


  代理IP的使用在网站服务器之间建立起来了一个信息中转站,信息先进入到代理服务器,这样操作,我们可以避免网站的反爬虫。


相关文章内容简介
推荐阅读
  • 03 2020-06
    大数据时代的代理知识

    大数据时代,如果你还对于网络数据的获取与使用搞不太清楚,那么今天介绍的爬虫操作就非常值得参考了。

  • 02 2020-01
    好用的http代理​怎么找?

    好用的http代理​怎么找?现在很多商家使用的都是网络的IP资源,直接全网扫描获取的IP,这IP质量自然是差了,想要找到好用高质量性价比高的http代理不容易啊。

  • 26 2019-03
    http代理ip是什么?

    http代理ip主要是浏览器的访问网页,用另一种方法说就是网络信息的中转站,是用户和客户端要求另一个服务器之间的一个中介,而且在代理服务器中与防火墙的服务器存在于同一台机器当中,

  • 10 2019-09
    什么是socks5协议的TCP认证?

    之前我们了解过socks5代理IP是怎么使用的?这种代理IP类型的使用越来越多,对于程序员而言,更好的了解它的工作原理以及相关知识,能够更加高效的开展工作,那么接下来,让我们解析socks5协

  • 08 2019-07
    租用代理ip的一些技巧

    租用代理ip的一些技巧,如果学到了,这对于我们选择代理ip非常有好处的。下面我们来看下吧:

  • 02 2019-09
    Python爬虫技巧:伪装浏览器访问User-Agent

    爬虫工作者在用代理IP开展爬虫业务的时候,尽管IP代理可以尽可能达到IP不被检测异常被封,但是由于爬虫是需要反复多次的操作,那么这个过程就会触发网站的反爬虫机制,所以有些时候,我

在线咨询
大客户经理
大客户经理
1829380381
13316264505

大客户经理微信

微信公众号

微信公众号

回到顶部