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运算π的值深入Python中科学计算的实现
Apr 17 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
Python操作csv文件实例详解
Jul 31 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
Python实现中英文全文搜索的示例
Dec 04 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
js+css在交互上的应用
2010/07/18 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
js 原型对象和原型链理解
2017/02/09 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
基于Vue实现拖拽功能
2020/07/29 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
个人求职简历的自我评价
2013/10/19 职场文书
初中学生操行评语
2014/12/26 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
Docker官方工具docker-registry案例演示
2022/04/13 Servers
CSS的calc函数用法小结
2022/06/25 HTML / CSS