python爬虫构建代理ip池抓取数据库的示例代码


Posted in Python onSeptember 22, 2020

爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理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):
  """
  抓取 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 =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')

以上就是python爬虫构建代理ip池抓取数据库的示例代码的详细内容,更多关于python爬虫构建代理ip池的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python开发之str.format()用法实例分析
Feb 22 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
Python中的默认参数实例分析
Jan 29 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
学Python 3的理由和必要性
Nov 19 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
如何学习Python time模块
Jun 03 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 #Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 #Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 #Python
python 如何区分return和yield
Sep 22 #Python
Python中三维坐标空间绘制的实现
Sep 22 #Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 #Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 #Python
You might like
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
用js做一个小游戏平台 (一)
2009/12/29 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
python批量下载图片的三种方法
2013/04/22 Python
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
网吧消防安全制度
2014/01/28 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
中班教师个人总结
2015/02/05 职场文书
体育个人工作总结
2015/02/09 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL