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. 11

    2019-09

    为什么高匿代理ip刷单更有效果?

    在一些网络销售平台上存在的刷单现象是众所周知的,其实在如今来说,很多消费者都不觉得它是一种欺骗消费者的行为了,更多的能够展现自己的实力。因为当我们通过某著名电商平台去购物

  2. 04

    2019-09

    手机ip代理软件安全吗?

    找免费的,很少,一般都是只提供一定的免费试用时间的,例如黑洞代理:

  3. 12

    2019-11

    怎么用Fiddler抓包工具捕获HTTPS会话

    在使用代理IP的时候我们经常会遇到一些问题, 我们经常通过抓包来分析问题,最常见的是用Fiddler工具来抓包。但在默认情况下,Fiddler不会捕获HTTPS会话,我们一起来看看怎么解决吧。

  4. 18

    2019-11

    如何使用Redis和Flask维护代理ip池?

    在进行爬虫工作的时候,经常会遇到IP被封的问题,烦不胜烦,还好可以使用代理IP来解决这一个麻烦。代理IP哪里来,有人说,网上很多免费的,把它们收集起来就有了,有人说直接找代理IP服

  5. 05

    2019-06

    国内IP和代理IP是什么?

    在网络中,我们经常会遇到IP地址这个概念,这也是网络中的一个重要的概念。所谓IP地址就是给每个连接在Internet上的主机分配一个在全世界范围唯一的32bit地址。

  6. 05

    2019-06

    爬虫代理ip有用吗?

    IP代理作为现代网络兴起的一种上网方式,成为了很多人的日常上网习惯。特别是一些爬虫们,这种代理方式更是必须的,那么什么是爬虫代理IP呢?