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类方法与对象方法
Mar 15 Python
Python在线运行代码助手
Jul 15 Python
Python实现简单的用户交互方法详解
Sep 25 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Django模型中字段属性choice使用说明
Mar 30 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
python为什么要安装到c盘
Jul 20 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
基于Python实现的购物商城管理系统
Apr 27 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
杏林同学录(八)
2006/10/09 PHP
简单的过滤字符串中的HTML标记
2006/12/25 PHP
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
对python中的装包与解包实例详解
2019/08/24 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
Linux如何压缩可执行文件
2013/10/21 面试题
致800米运动员广播稿
2014/02/16 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
学前班教学反思
2016/02/24 职场文书