python爬虫之如何建立一个自己的代理IP池

建立一个自己的代理IP池,随时更新用来抓取网站数据

fake_useragent使用示例

# 随机生成1个User-Agent
from fake_useragent import UserAgent

ua = UserAgent()
print(ua.random)

建立自己的IP代理池

import requests
import random
from lxml import etree
from fake_useragent import UserAgent


# 生成随机的User-Agent
def get_random_ua():
    # 创建User-Agent对象
    ua = UserAgent()
    # 随机生成1个User-Agent
    return ua.random

# IP访问测试网站: http://httpbin.org/get
url = 'http://httpbin.org/get'


# 从西刺代理网站上获取随机的代理IP
def get_ip_list():
    headers = {'User-Agent': get_random_ua()}
    # 访问西刺代理网站国内高匿代理,找到所有的tr节点对象
    res = requests.get('https://www.xicidaili.com/nn/', headers=headers)
    parse_html = etree.HTML(res.text)
    # 基准xpath,匹配每个代理IP的节点对象列表
    ipobj_list = parse_html.xpath('//tr')
    # 定义空列表,获取网页中所有代理IP地址及端口号
    ip_list = []
    # 从列表中第2个元素开始遍历,因为第1个为: 字段名(国家、IP、... ...)
    for ip in ipobj_list[1:]:
        ip_info = ip.xpath('./td[2]/text()')[0]
        port_info = ip.xpath('./td[3]/text()')[0]
        ip_list.append(
            {
                'http': 'http://' + ip_info + ':' + port_info,
                'https': 'https://' + ip_info + ':' + port_info
            }
        )
    # 返回代理IP及代理池(列表ip_list)
    return ip_list


# 主程序寻找测试可用代理
def main_print():
    # 获取抓取的所有代理IP
    ip_list = get_ip_list()
    # 将不能使用的代理删除
    for proxy_ip in ip_list:
        try:
            # 设置超时时间,如果代理不能使用则切换下一个
            headers = {'User-Agent': get_random_ua()}
            res = requests.get(url=url, headers=headers, proxies=proxy_ip, timeout=5)
            res.encoding = 'utf-8'
            print(res.text)

        except Exception as e:
            # 此代理IP不能使用,从代理池中移除
            ip_list.remove(proxy_ip)
            print('%s不能用,已经移除' % proxy_ip)
            # 继续循环获取最后1个代理IP
            continue

    # 将可用代理保存到本地文件
    with open('proxies.txt','a') as f:
        for ip in ip_list:
            f.write(ip + '\n')

if __name__ == '__main__':
    main_print()

写一个获取收费开放代理的接口

# getip.py
# 获取开放代理的接口
import requests

# 提取代理IP
def get_ip_list():
  api_url = 'http://dev.kdlapi.com/api/getproxy/?orderid=996140620552954&num=100&protocol=2&method=2&an_an=1&an_ha=1&sep=1'
  res = requests.get(api_url)
  ip_port_list = res.text.split('\r\n')

  return ip_port_list

if __name__ == '__main__':
    proxy_ip_list = get_ip_list()
    print(proxy_ip_list)

3、使用收费开放代理IP访问测试网站: http://httpbin.org/get

1、从代理网站上获取购买的普通代理的api链接
2、从api链接中提取出IP
3、随机选择代理IP访问网站进行数据抓取
from getip import *
import time
import random

url = 'http://httpbin.org/get'
headers = {'User-Agent' : 'Mozilla/5.0'}
proxy_ip_list = get_ip_list()

while True:
    # 判断是否还有可用代理
    if not proxy_ip_list:
        proxy_ip_list = get_ip_list()

    proxy_ip = random.choice(proxy_ip_list)
    proxies = {
        'http' : 'http://{}'.format(proxy_ip),
        'https' : 'https://{}'.format(proxy_ip)
    }
    print(proxies)

    try:
        html = requests.get(url=url,proxies=proxies,headers=headers,timeout=5,verify=False).text
        print(html)
        break
    except:
        print('正在更换代理IP,请稍后... ...')
        # 及时把不可用的代理IP移除
        proxy_ip_list.remove(proxy_ip)
        continue
  • 私密代理

语法格式

1、语法结构
proxies = {
    '协议':'协议://用户名:密码@IP:端口号'
}

2、示例
proxies = {
	'http':'http://用户名:密码@IP:端口号',
    'https':'https://用户名:密码@IP:端口号'
}

示例代码

import requests
url = 'http://httpbin.org/get'
proxies = {
    'http': 'http://309435365:[email protected]:16819',
    'https':'https://309435365:[email protected]:16819',
}
headers = {
    'User-Agent' : 'Mozilla/5.0',
}

html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text
print(html)

你可能感兴趣的:(爬虫)