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


相关文章内容简介
推荐阅读
  • 19 2019-02
    post请求和get请求有什么区别

    http协议是非常常见的,我们平常打开网页访问都是使用http请求的,http请求的方法比较多种,其中经常用到post请求和get请求,那么这两种请求有什么区别呢?使用哪种请求比较好?

  • 15 2019-10
    用代理IP 摆脱IP被封烦恼

    你是不是经历过IP被封的情况?在爬虫、网络营销的场景中,出现的最多,但是有了代理IP,大家就可以不用担心了。

  • 31 2019-05
    账号IP地址定位异常被封的几率大

    账号IP地址定位异常被封的几率大,这是很常见的事情。我们需要连接网络,这是一定要获取到IP地址才能连接到网络的。

  • 20 2019-03
    抓取安卓APP信息出现错误,是代理IP的问题吗?

    有时候在抓取APP信息时,无缘无故就出现错误了,但用其他手机测试又没有问题?这到底是什么原因导致的错误?会不会是使用代理IP的问题?我们分析一下:

  • 05 2020-02
    自动换ip效率更高

    HTTP代理IP软件大家都不陌生了,对于很多网络工作人员来说是必不可少的工具,提升了很多工作效率。但是很多人还是对HTTP代理IP软件不是很了解,还有很多人认为手动切换IP也很好,并不相信

  • 10 2019-08
    代理ip的有效时间有多长

    代理ip的有效时间有多长?既然是动态代理ip,自然是有时效的,时效最差的是免费代理ip,很多时候刚检测能用,但下一秒就不行了。使用这效果的代理ip是不行的,那么代理ip的有效时间有多

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

大客户经理微信

微信公众号

微信公众号

回到顶部