IP代理软件,http代理,API提取-黑洞HTTP

黑洞HTTP

您的位置: 首页 > 新闻资讯 > HTTP代理 > 正文

用python爬虫建立免费ip代理池

发布时间:2019年05月17日 来源:互联网

  用python爬虫建立免费ip代理池!用爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的爬虫代理ip免费的已经很难找了,那么现在就用python的requests库从各种提供免费代理ip的网站上爬取代理ip,创建一个ip代理池,以备使用。


用python爬虫建立免费ip代理池


  本代码包括ip的爬取,检测是否可用,可用保存,通过函数get_proxies可以获得ip,如:{‘HTTPS’: ‘106.12.7.54:8118’}


  下面放上源代码,并详细注释:


  import requests


  from lxml import etree


  from requests.packages import urllib3


  import random, time


  urllib3.disable_warnings()


  def spider(pages, max_change_porxies_times=300):


  """


  抓取 XiciDaili.com 的 http类型-代理ip-和端口号


  将所有抓取的ip存入 raw_ips.csv 待处理, 可用 check_proxies() 检查爬取到的代理ip是否可用


  -----


  :param pages:要抓取多少页


  :return:无返回


  """


  s = requests.session()


  s.trust_env = False


  s.verify = False


  urls = 'https://www.xicidaili.com/nn/{}'


  proxies = {}


  try_times = 0


  for i in range(pages):


  url = urls.format(i + 1)


  s.headers = {


  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',


  'Accept-Encoding': 'gzip, deflate, br',


  'Accept-Language': 'zh-CN,zh;q=0.9',


  'Connection': 'keep-alive',


  'Referer': urls.format(i if i > 0 else ''),


  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}


  while True:


  content = s.get(url, headers=s.headers, proxies=proxies)


  time.sleep(random.uniform(1.5, 4))  # 每读取一次页面暂停一会,否则会被封


  if content.status_code == 503:  # 如果503则ip被封,就更换ip


  proxies = get_proxies()


  try_times += 1


  print(f'第{str(try_times):0>3s}次变更,当前{proxies}')


  if try_times > max_change_porxies_times:


  print('超过最大尝试次数,连接失败!')


  return -1


  continue


  else:


  break  # 如果返回码是200 ,就跳出while循环,对爬取的页面进行处理


  print(f'正在抓取第{i+1}页数据,共{pages}页')


  for j in range(2, 102):  # 用简单的xpath提取http,host和port


  tree = etree.HTML(content.text)


  http = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[6]/text()')[0]


  host = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[2]/text()')[0]


  port = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[3]/text()')[0]


  check_proxies(http, host, port)  # 检查提取的代理ip是否可用


  def check_proxies(http, host, port, test_url='http://www.baidu.com'):


  """


  检测给定的ip信息是否可用


  根据http,host,port组成proxies,对test_url进行连接测试,如果通过,则保存在 ips_pool.csv 中


  :param http: 传输协议类型


  :param host: 主机


  :param port: 端口号


  :param test_url: 测试ip


  :return: None


  """


  proxies = {http: host + ':' + port}


  try:


  res = requests.get(test_url, proxies=proxies, timeout=2)


  if res.status_code == 200:


  print(f'{proxies}检测通过')


  with open('ips_pool.csv', 'a+') as f:


  f.write(','.join([http, host, port]) + '\n')


  except Exception as e:  # 检测不通过,就不保存,别让报错打断程序


  print(e)


  def check_local_ip(fn, test_url):


  """


  检查存放在本地ip池的代理ip是否可用


  通过读取fn内容,加载每一条ip对test_url进行连接测试,链接成功则储存在 ips_pool.csv 文件中


  :param fn: filename,储存代理ip的文件名


  :param test_url: 要进行测试的ip


  :return: None


  """


  with open(fn, 'r') as f:


  datas = f.readlines()


  ip_pools = []


  for data in datas:


  # time.sleep(1)


  ip_msg = data.strip().split(',')


  http = ip_msg[0]


  host = ip_msg[1]


  port = ip_msg[2]


  proxies = {http: host + ':' + port}


  try:


  res = requests.get(test_url, proxies=proxies, timeout=2)


  if res.status_code == 200:


  ip_pools.append(data)


  print(f'{proxies}检测通过')


  with open('ips_pool.csv', 'a+') as f:


  f.write(','.join([http, host, port]) + '\n')


  except Exception as e:


  print(e)


  continue


  def get_proxies(ip_pool_name='ips_pool.csv'):


  """


  从ip池获得一个随机的代理ip


  :param ip_pool_name: str,存放ip池的文件名,


  :return: 返回一个proxies字典,形如:{'HTTPS': '106.12.7.54:8118'}


  """


  with open(ip_pool_name, 'r') as f:


  datas = f.readlines()


  ran_num = random.choice(datas)


  ip = ran_num.strip().split(',')


  proxies = {ip[0]: ip[1] + ':' + ip[2]}


  return proxies


  if __name__ == '__main__':


  t1 = time.time()


  spider(pages=3400)


  t2 = time.time()


  print('抓取完毕,时间:', t2 - t1)


  # check_local_ip('raw_ips.csv','http://www.baidu.com')


  以上就是简单的教程,不过有网友表示,早晚会出现免费代理IP网站会不提供代理Ip的情况,因为这样的文章一发出来,马上一波人就会去爬,网站快扛不住流量的成本,就会动手赶人了。,


  不过对于小编看来,免费的代理IP一直被诟病的就是可用率低,因为大家都在用,导致这部分IP实际上已经被封得差不多了,真正要干活的话


  还是要购买付费的代理IP,这样可用率有保证,效率产出也有了保证,而提供免费代理的,往往也是给自己付费代理引流的罢了。且用且珍惜吧。


相关文章内容简介

1 用python爬虫建立免费ip代理池

  用python爬虫建立免费ip代理池!用爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的爬虫代理ip免费的已经很难找了,那么现在就用python的requests库从各种提供免费代理ip的网站上爬取代理ip,创建一个ip代理池,以备使用。  本代码包括ip的爬取,检测是否可用,可用保存,通过函数get_proxies可以获得ip,如:{‘HTTPS’: ‘106.12.7.54:8118’}  下面放上源代码,并详细注释:  import requests  from lxml import etree  from requests.packages import urllib3  import random, time  urllib3.disable_warnings()  def spider(pages, max_change_porxies_times=300):   [阅读全文]

热门标签

最新标签

推荐阅读

  1. 18

    2019-04

    有没有好用的IP代理或者换IP软件?

    日常工作需要换IP,知友们有没有合适的换IP软件推荐?价格公道的,最好是自动换不需要太多操作的。基本都是在电脑上操作,如果有手机客户端就更好了当然连接速度和IP质量也有要求,只是

  2. 20

    2019-03

    代理ip中的爬虫功能可以做哪些有意思的事?

    作为一家大数据公司的小编,每天的日常就是“爬爬爬”,很多人并不了解爬虫,觉得爬虫没什么用,今天就让小编来告诉大家,爬虫能做什么有趣的事。

  3. 19

    2019-03

    爬虫使用代理防封IP

    在我们使用爬虫进行数据爬取的时候,爬着爬着就经常会遇到这种情况出现“HTTP Error 403: Forbidden ”的提示,这是啥意思呢,其实他是一种http状态码,表示你在请求一个资源文件但是nginx不允许

  4. 14

    2019-11

    如何解决代理ip的反爬策略问题?

    代理ip出现问题,其中反爬策略问题是老生常谈的问题,也是让用户头疼的问题,因为反爬策略会不断的升级,这就需要爬虫策略也要跟着不断的升级,才能可持续的工作。那么,该怎么解决呢

  5. 20

    2019-06

    使用代理IP后返回空,为什么不能全部都成功

    很多朋友在网络工作中经常会碰到各种各样的问题,比如访问某网站加载太慢,多刷新了几次被提示访问太频繁IP被限制;有的网站注册了几个账号后提示当前IP最多只能注册3个账号或者直接封

  6. 19

    2019-03

    python爬虫批量抓取ip代理

    使用爬虫抓取数据时,经常要用到多个ip代理,防止单个ip访问太过频繁被封禁。