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查找指定具有相同内容文件的方法
Jun 28 Python
Python反转序列的方法实例分析
Mar 21 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
Apr 09 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
Django中的文件的上传的几种方式
Jul 23 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
Python处理mysql特殊字符的问题
Mar 02 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
Python根据URL地址下载文件并保存至对应目录的实现
Nov 15 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 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
php5.5中类级别的常量使用介绍
2013/10/02 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
jQuery extend()详解及简单实例
2017/05/06 jQuery
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
python各种语言间时间的转化实现代码
2016/03/23 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Python编写一个优美的下载器
2018/04/15 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
行政助理岗位职责范文
2013/12/03 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
车队安全员岗位职责
2015/02/15 职场文书
2016年十一促销广告语
2016/01/28 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python