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

    2019-06

    优质爬虫http代理ip怎么选择?

    最近跟几个爬虫采集的客户聊天,无论互联网行业发展到何种地步,“资源”永远是任何互联网公司必不可少的弹药粮草。夸大些讲,任何一个互联网公司都会用到不同类型的数据。那么数据从

  2. 11

    2019-07

    质量差的http代理对爬虫有什么危害?

    现在爬虫已经成了获取数据的必不可少的方式,在使用爬虫多次爬取同一网站时,经常会被网站的IP反爬虫机制给禁掉,为了解决封禁IP的问题,一般是使用http代理,使用代理之后可以让爬虫伪

  3. 25

    2019-03

    如何选择,爬虫代理IP的多个解决方案

    众所周知,一个IP做不了爬虫工作,没有大量的IP支撑,爬虫工作者寸步难行。那么爬虫IP哪里来呢?这难不倒爬虫工程师们,他们有好几种解决方案,让我们一起来看看吧。

  4. 19

    2019-06

    分布式爬虫需要代理IP?

    大数据时代来临,爬虫工作者的春天也随之来了。然而在我们进行爬虫业务时,却经常受到目标网站反爬虫机制的阻碍,尤其是分布式爬虫,因为采集信息量和采集速度过快。

  5. 13

    2019-04

    如何验证ip代理是否为匿名?

    现在市面上有很多提供代理ip的供应商,但是每一家供应商产品的质量品质都不一,很多供应商的代理ip匿名度并不高,那么应该怎么验证代理ip的匿名程度呢?

  6. 22

    2019-11

    使用代理ip,怎么验证是否成功呢?

    浏览器搜索引擎,访问网页是我们最常用的,无论是在工作上还是在生活上都要使用到,有很多用户在浏览访问页面时,不像留下访问的痕迹以及自己使用的真实ip,想要隐藏自己的真实ip,增