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 25 Python
Python统计列表中的重复项出现的次数的方法
Aug 18 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
谈谈Python中的while循环语句
Mar 10 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
Django自带的用户验证系统实现
Dec 18 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
python中redis包操作数据库的教程
Apr 19 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+MYSQL 出现乱码的解决方法
2008/08/08 PHP
php array_search() 函数使用
2010/04/13 PHP
PHP 图片上传代码
2011/09/13 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
Symfony生成二维码的方法
2016/02/04 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
Python中变量交换的例子
2014/08/25 Python
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python3 实现调用串口功能
2019/12/26 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
《匆匆》教学反思
2014/02/22 职场文书
卖车协议书
2014/04/21 职场文书
党建工作整改措施
2014/10/28 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
公司开除员工通知
2015/04/22 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB