建立一个自己的代理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:szayclhp@122.114.67.136:16819',
'https':'https://309435365:szayclhp@122.114.67.136:16819',
}
headers = {
'User-Agent' : 'Mozilla/5.0',
}
html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text
print(html)