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使用win32com在百度空间插入html元素示例
Feb 20 Python
Python 自动补全(vim)
Nov 30 Python
在Python的Django框架中编写编译函数
Jul 20 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
20个常用Python运维库和模块
Feb 12 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python实现月食效果实例代码
Jun 18 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
Python用5行代码实现批量抠图的示例代码
Apr 14 Python
基于matplotlib xticks用法详解
Apr 16 Python
Python学习之迭代器详解
Apr 01 Python
python处理json数据文件
Apr 11 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
php解析字符串里所有URL地址的方法
2015/04/03 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
python中global用法实例分析
2015/04/30 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
从0开始的Python学习016异常
2019/04/08 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
python使用配置文件过程详解
2019/12/28 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python 爬取小说并下载的示例
2020/12/07 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
几道PHP面试题
2013/04/14 面试题
新学期决心书
2014/03/11 职场文书
保险经纪人求职信
2014/03/11 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
财产分割协议书范本
2014/11/03 职场文书
中学生学习保证书
2015/02/26 职场文书
大学感恩节活动总结
2015/05/05 职场文书
付款证明格式范文
2015/06/19 职场文书
2015年女工委工作总结
2015/07/27 职场文书
健康教育主题班会
2015/08/14 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers