前言

这一段时间爬取一些数据的时候遭到了封ip。免费的ip满足不了我的需求并且不是很稳定,所以选择的代理ip,我买了一天2000ip,这些对于我的小爬爬就够了。记录了第一次使用代理ip的一些坎坷和经历,希望能够减少初学者的坑。

更新:在使用代理是如果频率过快返回的是‘{“code”:“3001”,“msg”:“提取频繁请按照规定频率提取!”}’不可将该msg添加到ip池中,故需要先判断返回状态。

在使用代理ip之前,首先要了解几样东西:

  • 对返回ip格式的操作,很显然xx代理是给出json格式的数据,可以直接请求后返回json数据进行操作包过提取,删除,增加。当然,在实际使用ip代理的时候最好先在浏览器中请求一次,复制下来新建一个py文件练习对其操作。
  • ip的有效期,现在大部分的ip代理都是有有效期的,我买的就是1-5分钟的有效期(蘑菇的有效期其实还是挺长的),当ip失效后你需要将此ip从ip池中删除。当ip不够的时候又要引入新的ip添加到当前的ip池中。要动态维护ip池。
  • :python3使用代理ip的方式:下文会介绍,以前我的python3使用代理ip也有格式,你爬取的是http用http,是https用https就行。
  • 异常处理,再写爬虫的时候一定要对所有可能产生异常的操作进行try except的异常处理。异常又要注意是否为超时异常,还是ip不可用,过期的异常,还是操作dom树的时候产生的异常。不同的异常要采用不同的策略。(可用状态码,全局变量判断)。
  • :注意使用信息和要求:我买的那个xx代理不能请求频率超过5s。还有就要有添加本地ip地址。(可能是基于安全考虑)
  • :分析目标网站对ip的需求。你需要设置ip池的最小和请求ip的个数不至于太大或太小,可以预先测试。打个比方你爬的网站同一个时段10个ip更换就不够了。你不至于开100个ip去爬吧,ip过期而没咋么用就是对资源的浪费(当然土豪请随意。)

我个人的解决方向:

  • 先写个小程序操作返回的json数据测试。
  • 设置全局的列表ipdate[],全局的一个msg{}字典(其实字典就是列表中随机选的一个ip和端口,只不过通过记录标记可以很好的进行删除操作?),
  • 将请求ip的操作添加到全局列表(数组)中写成一个loadip()函数,以便判断ip不够时候即使添加(列表extend方法了解下,不是append哦)。
  • 写一个随机选ip的函数getproxies(),更换proxies{}里面的内容。同时msg也要更换。注意python函数改变全局变量需要在函数里先global msg声明。每次进行http(s)请求前执行一次更新操作。
  • 所有的操作都在try excpet操作,对不同的异常采用不同处理。比如(有的因为ip异常没爬到需要从爬,而有的因为dom结构异常就需要跳过)。
    当然实际处理可能会遇到各种问题,比如页面跳转重定向,ssl证书,有的网站也会卡浏览器名称,或者cookie。这里不做过多介绍了。
    下面附上详细步骤:
  1. 添加白名单:
  2. 提取api:
  3. 写一个py文件测试自己的接口返回的文件
  4. 测试无误后可接入爬虫程序:附上我的demo(爬取马蜂窝)后面会写具体操作,这里不讲爬虫的思路。
import requests
from bs4 import BeautifulSoup
import pymysql
import re
import json
import time
import random
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root",password="123456", db="date", port=3306)
ipdate=[]
msg={}
proxies = {'http': ''}
stadus=0
def loadip():url='http://piping.mogumiao.com/proxy/api/get_ip_bs?appKey=14b5feb7445241329a1381e26e1f6aa7&count=20&expiryDate=0&format=1&newLine=2'req=requests.get(url)date=req.json()ipdate2=date['msg']global ipdateipdate.extend(ipdate2)print(ipdate)
def getproxies():b=random.choice(ipdate)d = '%s:%s' % (b['ip'], b['port'])global proxiesproxies['http']=dglobal msgmsg=b
# 使用cursor()方法获取操作游标
cur = db.cursor()
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}def jud(cityid):try:url='http://www.mafengwo.cn/travel-scenic-spot/mafengwo/'+str(cityid)+'.html'if(len(ipdate)<30):#拓展ip池loadip()getproxies()req=requests.get(url,headers=header,proxies=proxies,timeout=2,allow_redirects=False)global stadusstadus=req.status_codeprint(cityid,stadus)if stadus==200:#请求成功html=req.textsoup=BeautifulSoup(html,'lxml')href=soup.find(attrs={'class':'navbar clearfix'})infourl='http://www.mafengwo.cn'+str(href.find(attrs={'data-cs-p':'概况'}).get('href'))#主要信息viewhref='http://www.mafengwo.cn'+str(href.find(attrs={'data-cs-p':'景点'}).get('href'))#景点信息foodhref='http://www.mafengwo.cn'+str(href.find(attrs={'data-cs-p':'餐饮'}).get('href'))#餐饮信息'updatehref="update cityhref set infohref='%s',viewhref='%s',foodhref='%s' where city_id=%d"%(infourl,viewhref,foodhref,cityid)print(cityid,foodhref,len(ipdate))try:cur.execute(updatehref)db.commit()except Exception as e:print(updatehref,e)db.rollback()stadus=0except Exception as e3:if ( stadus == 301 or stadus==302 or stadus==200):print('no prbo',cityid,stadus)else:print(e3, cityid, stadus)try:print('remove')ipdate.remove(msg)#   ipdate.remove(msg)except Exception as  e6:print(e6)jud(cityid)loadip()#先填充一部分ip
time.sleep(5)#休眠五秒
sql='select city_id,infohref from cityhref'
cur.execute(sql)
value=cur.fetchall()
# for cityid in value:
#     if(cityid[1]==None):
#         print('start:',cityid[0])
#         jud(cityid[0])
#jud(64641)
# jud(5429475)
db.close()

有些核心部分已经被注释掉,如果有其他问题可以一起交流。总的来说蘑菇代理还是不错的,可用率还行,时间也没那么苛刻。

如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai

python3使用付费代理和ip池的维护相关推荐

  1. 八 web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置 build_opener()初始化IP install_opener()将代理IP设置 ...

  2. ip模拟工具_HTTP代理和IP代理有什么区别

    在我们互联网工作者当中,HTTP代理和IP代理相信都不陌生.因为在大家工作的时候,一些特定的领域或者功能需要通过代理软件来完成.虽然这个软件不是一定要使用,可是一旦不用不仅会让工作效率变低,爬虫工作者 ...

  3. Socks5代理和IP代理

    Socks5代理和IP代理是常用的网络代理服务,它们为用户提供了匿名访问和保护隐私的功能.在本文中,我们将介绍这两种代理的基本概念和工作原理,并展示如何编写一个简单的代理服务器. 一.什么是Socks ...

  4. python开源ip代理池_[技术]基于python实现的短效代理ip池程序

    我们在写爬虫程序的时候,或者是抓取数据的时候,遇到一些发爬不是很厉害的网站,一般都是通过代理ip来实现绕过对方的反爬措施. 一般好的代理都是需要付费的,免费的代理速度慢,而且难找.市面上也有很多对应的 ...

  5. 搭建代理IP池的方法

    突破次数的限制就可以使爬虫更高效的工作,代理IP是突破次数限制,提高爬虫高效工作的最好的工具.所以,很多人都想通过建立IP池的方法,实现换IP突破限制,那么这IP池如何进行搭建呢? 一,免费搭建代理I ...

  6. Scrapy框架爬取我爱我家二手房信息存储CSV、mysql(IP代理和User-Agent用户代理)

    有一段时间没出来活动了闲来无事弄个玩玩O(∩_∩)O哈哈~ 想必学过Scrapy框架的人都知道如何创建Scrapy和运行,那么我这里呢现将我创的框架展示一下 scrapy startproject p ...

  7. Python3爬虫教程之ADSL拨号爬虫ip池的使用

    在我之前做爬虫经常需要维护自己的爬虫ip池,他可以挑选出很多有用的爬虫地址,因为不是专业的而且这些爬虫ip通常是公共爬虫ip,所以可用率不是太高,而且这样类型的地址很大情况下都是多人共用的,被封地址概 ...

  8. Python3网络爬虫开发实战,IP代理池的维护

    我们在上一节了解了代理的设置方法,利用代理我们可以解决目标网站封 IP 的问题,而在网上又有大量公开的免费代理,其中有一部分可以拿来使用,或者我们也可以购买付费的代理 IP,价格也不贵.但是不论是免费 ...

  9. Python3网络爬虫(十一):爬虫黑科技之让你的爬虫程序更像人类用户的行为(代理IP池等)

    转载请注明作者和出处:http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 前言 黑 ...

最新文章

  1. Windows10下SSH远程拷贝文件
  2. python 轨迹识别
  3. 编译执行和解释执行的区别
  4. CSS定位(postion)和移动(float)
  5. leetcode 134. 加油站(Gas Station)
  6. 2021快手服饰行业数据价值报告
  7. 容我说下windows linux macosx
  8. ICommand接口
  9. 开发环境各个版本的下载
  10. mysql成绩统计数据库设计_MySQL数据库设计——以学生成绩数据库为例
  11. npm 安装 git linux,如何直接从GitHub安装NPM软件包?
  12. paip.表格化CSV输出
  13. Ubuntu中推荐使用的读代码软件
  14. 机器学习处理信号分离_【火炉炼AI】机器学习054-用ICA做盲源分离
  15. 520情人节礼物可以送什么?最实用的礼物推荐
  16. 因果推断(Causal Inference)概要
  17. 笔记本计算机的清洁保养知识,笔记本电脑怎么维护 笔记本电脑维护保养技巧【详解】...
  18. 如何实现手机远程控制电源开关
  19. 华为平板计算机的隐藏功能,华为平板MatePad的3种隐藏玩法,你都不知道呢
  20. 利用Excel实现数据抽样

热门文章

  1. 屏幕色温自动调节小助手
  2. 印度-地理~人文历史~经济~政治
  3. lessons learned from the Qlikview loads the data from DB into qvd files
  4. 日语标点符号用法解说!
  5. 让数据站住脚-浅谈用户研究中的信度与效度
  6. php 403 -禁止访问 访问被拒绝,HTTP 错误 403.6 - Forbidden 访问IP地址被拒绝
  7. IEEE 802.15.4协议完整中文版(4)
  8. 使用Visual Studio调试BGFX的Shader
  9. 如何学习一项新的IT技术
  10. Java核心技术36讲(个人整理)