问题描述

在做数据抓取的时候,经常会碰到有些网站对同一IP的访问频率做限制。遇到这种情况一般只有两种解决方案:

  1. 降低抓取频率。这种方法在数据变化不频繁,数据量不大的情况下还好,但是,如果数据变化频繁或者数据量庞大,此方法明显不能满足需求。
  2. 使用代理IP。抓取的过程中,经常更换代理IP,这种方法基本可以有效解决同一IP访问频率限制的问题。此方案的难点在于如何获取大量可用的代理IP。

代理IP获取

代理IP的获取途径基本也就两种:

  1. 购买付费代理IP。一般都是按使用时长和代理IP数收费,优点就是可靠性高。
  2. 使用免费代理。可以从免费代理网站获取,但是稳定性不好,绝大部分都会很快失效。

付费代理没什么好讲的,付款之后一般就可以拿到数据接口,程序里边直接调用即可。

下面讲一下免费代理IP的获取及筛选。这种出力不讨好的繁琐工作当然应该交给程序来自动完成。

这里以西刺代理为例讲一下获取https代理的分析过程并给出示例程序。

通过对页面请求进行分析,可以找到包含https代理的实际请求地址是: http://www.xicidaili.com/wn/{page},第一页page=1,第二页page=2...以此类推。西刺代理的IP每几分钟都会更新一次,所以每次只抓取前几页基本就可以了。

网络请求使用Python的requests库,页面解析使用pyquery。也可以使用urllib和beautifulSoup,不过个人感觉稍微麻烦一些。

废话不多说了,下面直接上程序,代码基于Python3编写,如果要在Python2下运行需要稍作修改。

"""
该程序用于从代理网站获取可用ip
使用方法1: 直接运行该文件,会在同目录下生成ips.txt文件,文件内包含可用的代理
使用方法2: 其他程序导入该文件,然后直接使用该文件内定义的全局变量'proxies'
"""
import random
import threading
import time
from concurrent import futuresimport requests
from pyquery import PyQueryheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2306.400 QQBrowser/9.5.10530.400'}
# 检测代理ip有效性的网站
CHECK_URL = 'https://ip.cn'
# 抓取地址(西刺代理)
FETCH_URL = 'http://www.xicidaili.com/wn/{}'
# 抓取页数,每页100条
PAGES = 3
# 代理类型(http/https)
PROXY_TYPE = 'https'
# 有效代理ip列表
proxies = []
# 线程池,用于同时验证多个代理ip
POOL = futures.ThreadPoolExecutor(max_workers=50)def add_proxy(proxy: str):"""添加代理:param proxy: 代理ip+端口号:return:"""try:r = requests.get(CHECK_URL, proxies={PROXY_TYPE: proxy}, timeout=30)print(PyQuery(r.content.decode()).find('#result').text(), '\n')if r.status_code == 200 and proxy not in proxies:proxies.append(proxy)except Exception as e:if proxy in proxies:proxies.remove(proxy)print(proxy, e)def fetch_proxy():"""抓取代理ip:return:"""for page in range(1, PAGES + 1):r = requests.get(FETCH_URL.format(page), headers=headers)doc = PyQuery(r.content.decode('utf-8'))# 获取数据列表对应的tabletable = doc('#ip_list')# 获取table中除了表头以外的所有行rows = table('tr:nth-of-type(n+2)').items()# 提取每一行中的ip和端口号for row in rows:ip = row('td:nth-of-type(2)').text()port = row('td:nth-of-type(3)').text()proxy = ip + ':' + port# 在线程池中检测该代理是否可用POOL.submit(add_proxy, proxy)# 10秒钟后抓取下一页time.sleep(10)def run():while True:try:fetch_proxy()print('有效代理:', proxies)# 将有效代理写入文件with open('ips.txt', 'w', encoding='utf-8') as f:f.write('\n'.join(proxies))except Exception as e:print(e)# 抓取一次之后休息一段时间,防止被屏蔽time.sleep(random.randint(100, 600))# 启动抓取线程
threading.Thread(target=run).start()

程序运行一段时间之后,打开ips.txt文件即可看到抓取到的可用代理IP,如图:

Python 抓取可用代理IP相关推荐

  1. Python 爬取可用代理 IP

    2019独角兽企业重金招聘Python工程师标准>>> 通常情况下爬虫超过一定频率或次数,对应的公网 IP 会被封掉,为了能稳定爬取大量数据,我们一般从淘宝购买大量代理ip,一般 1 ...

  2. python ip动态代理_Python实现爬取可用代理IP

    Python实现爬取可用代理IP,在实现爬虫时,动态设置代理IP可以有效防止反爬虫,但对于普通爬虫初学者需要在代理网站上测试可用代理IP.由于手动测试过程相对比较繁琐,且重复无用过程故编写代码以实现动 ...

  3. 如何利用python抓取免费的IP资源、并测试http代理是否可用

    最近上某乎,发现很多人在用免费的HTTP代理,但是又不知道这个IP是不能可用的,今天带大家get如何判断你网上抓取来的免费HTTP代理是否可用. 一.获取可用的HTTP代理 先用Ping 获取一些可用 ...

  4. 用Python爬虫抓取免费代理IP

    点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 不知道大家有没有遇到过"访问频率太高"这样的网站提示,我们需要等待一段 ...

  5. 第11篇- 抓取免费代理IP并搭建自己的代理IP池

    提前声明:该专栏涉及的所有案例均为学习使用,如有侵权,请联系本人删帖! 文章目录 一.前言 二.了解代理IP 三.抓取代理ip网站 四.完整代码 一.前言 使用代理IP原因:对于我们数据抓取来说,由于 ...

  6. 数据抓取 -- 使用代理IP爬取数据:(2):使用timeout 时要注意,防止数据加载不完整 ,导致爬取丢失(举例)

    问题: 在使用代理IP爬取数据的时候,经常会出现爬取的网址信息不完整的现象.其中有个原因就是timeout设置问题. 代码如下: import requests from bs4 import Bea ...

  7. python爬取快代理IP并测试IP的可用性

    用到的网站https://www.kuaidaili.com/,免费的IP很不稳定,随时会挂,有需求的还是购买付费IP比较稳 import requests from urllib import pa ...

  8. Python 抓取 快代理、西刺代理 、西拉代理等等 构建免费代理池

    import reimport requests from lxml import etreeheaders = {"User-Agent": "Mozilla/5.0 ...

  9. Python爬虫实战013:Python爬取免费代理ip

    import requests import time import random from lxml import etree from fake_useragent import UserAgen ...

最新文章

  1. oracle 操作表
  2. 爬虫框架webmagic与spring boot的结合使用--转
  3. 用计算机语言画曲线,用C语言控制台画简单的曲线
  4. linux加载内核后如何运行app,Android app启动过程
  5. 【算法竞赛学习】心跳信号分类预测-建模与调参
  6. 漫画 | 强化学习这都学不会的话,咳咳,你过来下!
  7. Disk Drill Enterprise for Mac(数据恢复软件)
  8. Java实现人力资源管理系统
  9. 指数型组织:打造独角兽公司的11个最强属性
  10. 【Appium实战】如何使用mumu模拟器模拟安卓手机
  11. 入门易精通难的Unity要如何学
  12. 程序员是不是青春饭?年纪大了何去何从
  13. 技术牛人---章文嵩博士---做系统要先了解业务的需求
  14. cesium添加填充_cesium实现注记功能
  15. 第四十章 Caché 变量大全 $ZREFERENCE 变量
  16. 将quantopian的动量策略迁移到老虎证券量化api
  17. orcale报错 无效数字
  18. ChatGPT - 横看成岭侧成峰
  19. 记一次 对新浪微博客户端 的scheme唤醒/通信
  20. Rust 14: 文件读写

热门文章

  1. BEV感知PETR-V1和PETR-V2
  2. php如何删除非空目录,php怎样删除非空目录_后端开发
  3. SpringBoot-JPA多数据源
  4. clover windows安装_Mac太贵?小北教你如何安装黑苹果
  5. 【大学四年自学Java的学习路线】观语如临情中景,无限感激言岂尽。 自知无兄难过河,谢言不叙恩情记!
  6. 一篇文章帮你搞懂什么是“最小可行性产品”(MVP),以及如何实现!
  7. (已解决)win10+ubuntu18.04双系统,ubuntu锁屏后无法唤醒,重启黑屏闪烁无法进入命令行模式
  8. canvas画布变换画六芒星
  9. php极差平级,平行志愿有级差吗 志愿极差是什么
  10. 计算机桌面运行在哪个文件夹,电脑桌面上的文件在C盘哪个文件里面?