前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬取免费代理IP

爬取免费代理IP

作者头像
Eternity
发布2022-08-24 20:03:20
5160
发布2022-08-24 20:03:20
举报

介绍

每次爬网站的时候总是被一些网站的反爬机制给封IP,所以就需要一些代理IP,但是很多代理IP都要钱,不要钱的很多不能用,所以就写了这么个代码来爬取代理IP

思路

  1. 确定爬取的url路径,headers参数
  2. 发送请求 – requests 模拟浏览器发送请求,获取响应数据
  3. 解析数据 – parsel 转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
  4. 保存数据

准备

  • PYthon3.7
  • pycharm (其他的编辑器也可以)
  • 模块 requests parsel time(安装模块指令pip install requests && pip install parsel)

目标网站

https://www.kuaidaili.com/free

步骤

第一步

导入模块,确定爬取的url路径,headers参数

代码语言:javascript
复制
import requests
import parsel
import time

base_url = 'https://www.kuaidaili.com/free/inha/1/'
headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

第二步

发送请求 – requests 模拟浏览器发送请求,获取响应数据

代码语言:javascript
复制
response = requests.get(base_url, headers=headers)
data = response.text

第三步

解析数据 – parsel 转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理

代码语言:javascript
复制
html_data = parsel.Selector(data)
parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')  # 返回Selector对象

第四步

循环遍历,二次提取,构建代理ip字典

代码语言:javascript
复制
	for tr in parse_list:
		proxies_dict = {}
		http_type = tr.xpath('./td[4]/text()').extract_first()
		ip_num = tr.xpath('./td[1]/text()').extract_first()
		port_num = tr.xpath('./td[2]/text()').extract_first()
		proxies_dict[http_type] = ip_num + ':' + port_num
		print(proxies_dict)
		proxies_list.append(proxies_dict)
		time.sleep(0.5)
print(proxies_list)
print("获取到的代理ip数量:", len(proxies_list), '个')		

第五步

检测代理ip可用性,用获取到的IP访问百度或者其他网站,就可以检测其可用性

代码语言:javascript
复制
def check_ip(proxies_list):
    """检测ip的方法"""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
 
    can_use = []
    for proxy in proxies_list:
        try:
            response = requests.get('http://www.baidu.com', headers=headers, proxies=proxy, timeout=0.1)  # 超时报错
            if response.status_code == 200:
                can_use.append(proxy)
        except Exception as error:
            print(error)
        finally:
            print("当前ip:", proxy, '检测完成')
 
    return can_use

打印出数据

代码语言:javascript
复制
can_use = check_ip(proxies_list)
print("能用的代理:", can_use)
print("能用的代理数量:", len(can_use))

完整代码

代码语言:javascript
复制
import requests
import parsel
import time
 
 
def check_ip(proxies_list):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
 
    can_use = []
    for proxy in proxies_list:
        try:
            response = requests.get('http://www.baidu.com', headers=headers, proxies=proxy, timeout=0.1)  # 超时报错
            if response.status_code == 200:
                can_use.append(proxy)
        except Exception as error:
            print(error)
        finally:
            print("当前ip:", proxy, '检测完成')
 
    return can_use
 
 
proxies_list = []
for page in range(1, 10): #更换数字,选择爬取页数
    print('++++++++++++++++++++++++++++正在爬取第{}页数据+++++++++++++++++++++++++++++'.format(page))
    base_url = 'https://www.kuaidaili.com/free/inha/{}/'.format(page)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

    response = requests.get(base_url, headers=headers)
    data = response.text
    html_data = parsel.Selector(data)
    parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')  # 返回Selector对象
    for tr in parse_list:
        proxies_dict = {}
        http_type = tr.xpath('./td[4]/text()').extract_first()
        ip_num = tr.xpath('./td[1]/text()').extract_first()
        port_num = tr.xpath('./td[2]/text()').extract_first()
        proxies_dict[http_type] = ip_num + ':' + port_num
        print(proxies_dict)
        proxies_list.append(proxies_dict)
        time.sleep(0.5)
 
print(proxies_list)
print("获取到的代理ip数量:", len(proxies_list), '个')
can_use = check_ip(proxies_list)
print("能用的代理:", can_use)
print("能用的代理数量:", len(can_use))	

使用代理访问的食用方法

就拿我们经常使用的 requests 库来说

使用代理 ip 方法如下

  1. 定义代理IP
代码语言:javascript
复制
proxies = { 
        'http' : 'http://xx.xxx.xxx.xxx:xxxx',
        'http' : 'http://xxx.xx.xx.xxx:xxx',
        ....
    }  
  1. 使用代理
代码语言:javascript
复制
response = requests.get(url,proxies=proxies)

和请求头放一起

接下来就可以创建一个属于自己的IP池了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 思路
  • 准备
  • 目标网站
  • 步骤
    • 第一步
      • 第二步
        • 第三步
          • 第四步
            • 第五步
            • 完整代码
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档