您的位置:首页 > 新闻资讯 >文章内容
如何使用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的使用在网站服务器之间建立起来了一个信息中转站,信息先进入到代理服务器,这样操作,我们可以避免网站的反爬虫。


相关文章内容简介
推荐阅读
  • 06 2019-05
    提示ip相同怎么换IP?

    提示ip相同怎么换IP?由于IP地址的缺乏,很多使用的都是局域网,或者是共用IP池,使用的是动态IP,因此IP地址比较类似,或者是一样,如果频繁使用很有可能会被封,那么如果出现这样的问题

  • 11 2019-04
    一个免费的异步爬虫代理池如何搭建?

    一个免费的异步爬虫代理池如何搭建?技术进步,自然各种网站也会加强自身的防御,现在爬虫如此多,不防着点,容易出问题。因此,换IP访问网站是目前大家都比较常用的突破反爬虫的方法

  • 27 2019-06
    动态IP不够用怎么办?

    动态IP不够用怎么办?想换个IP地址,但是重启之后IP地址是换了,但是换来换去也就那么几个的,作用不大,这该怎么办呢?动态IP不够用怎么办?

  • 19 2020-08
    代理IP会发现真实IP地址吗

    平时我们上网时,本地的IP地址可能会泄露给其他人,当被一些技术人员获取到时有可能产生我们的个人隐私安全问题。

  • 01 2019-07
    游戏IP限制代理IP能解决吗?

    游戏IP限制代理IP能解决吗?这是问题,很多游戏玩家都比较关注的,尤其是现在玩游戏的玩家越来越多了。但是呢,不管是个人还是工作室,如果玩的游戏要多开,都要注意被封号的问题,大

  • 13 2019-06
    数据采集离不开代理ip的支持

    数据采集离不开代理ip的支持,因为现在数据产生比较快,我们需要分析一件事情,可能需要分析很多的信息才能挖机到有价值的资料。而要用大量的信息,并不是任你使用的,这需要去一些平

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

大客户经理微信

微信公众号

微信公众号

回到顶部