数据采集不可或缺的技巧:Python3 requests使用代理IP请求网络数据源码分享
本文讲述了如何使用Python爬虫中的代理IP,以及获取代理IP的方法。注意代理IP的稳定性与可用性,并设置合适的参数提高成功率。
前言:
在进行大规模数据采集时,我们可能会因为频繁访问同一网站而被屏蔽,导致无法正常爬取所需的数据。为了解决这个问题,我们可以使用代理IP来隐藏我们的真实IP地址,以减少被屏蔽的概率。本文将介绍Python3中使用requests库与代理IP配合完成网络数据采集的方法,并提供源码分享。
实现方法: Python3提供了非常方便的requests库,用于进行HTTP请求和处理响应。我们可以通过设置proxies参数来支持对网络请求的代理服务器进行配置。以下是使用代理IP请求网络数据的代码示例:
import requests
# 设置代理IP
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'https://127.0.0.1:8080',
}
# 发起HTTP请求
response = requests.get('https://www.example.com', proxies=proxies)
# 处理响应结果
if response.status_code == 200:
res_text = response.text
print(res_text)
else:
print('请求失败')在上面的代码示例中,我们首先定义了一个代理IP字典proxies,包含http和https两个协议的代理地址。然后,我们使用requests库的get方法发起HTTP请求,并通过proxies参数指定使用代理IP进行连接。最后,当响应状态码为200时,我们提取出相应结果并进行处理,否则输出“请求失败”的信息。
需要注意的是,代理IP地址和端口会根据实际情况而变化,因此代码中的这些参数需要根据具体场景进行修改才能正常工作。
import requests
def get_data_with_proxy(url, proxy):
"""
使用代理IP获取数据
:param url: 请求的URL
:param proxy: 代理IP地址(格式为"ip:port")
:return: 返回请求得到的数据
"""
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}"
}
try:
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, proxies=proxies, timeout=10)
if response and response.status_code == 200:
return response.text
except Exception as e:
print(f'[WARN] {e}')
return ''
if __name__ == '__main__':
url = 'https://www.example.com'
proxy_address = '127.0.0.1:8080'
html_content = get_data_with_proxy(url, proxy_address)
if html_content != '':
print(html_content)在本例中,我们定义了一个名为get_data_with_proxy的函数,其中url参数用于指定请求网站的URL地址,proxy参数指定代理IP地址。该函数返回发送请求后从响应中获取到的HTML内容或空字符串。
由于代理IP的连接稳定性受网络环境合适位置等多种因素影响,对于一些不稳定的代理IP是否可用需要进行判断和识别。而为了增加代理IP的可用性,我们还通过设置请求超时时间和User-Agent等参数来提高请求的成功率。
【代理IP怎么获得?】
代理IP的获取方法有以下几种:
免费获得代理IP地址:可以通过爬虫程序、代理IP软件或者在线免费代理IP网站获取代理IP。但是免费代理IP的缺点是需要验证获得的IP,提取起来很麻烦,很费时。
购买付费代理IP:可以在网上找到付费代理IP,相对免费,付费代理IP池有专人维护,有技术支持,质量好,速度快,能很大程度的提高工作效率。
自己搭建代理IP池:可以使用自己的电脑搭建代理IP池,但是需要注意,自己的电脑可能需要不间断地运行,而且可能会存在性能问题。
总之,获取代理IP的方法多种多样,可以根据自己的需求和实际情况选择合适的方法。
获取代理IP的代码例子:
def getProxy():
while True:
try:
# API URL
url = 'http://***'
# 白名单URL
white = 'http://***?white='
r = requests.get(url).json()
if r['code'] == 0:
ip = "{}:{}".format(r['data'][0]['ip'], r['data'][0]['port'])
try:
proxies = {
"http": "{}".format(ip),
"https": "{}".format(ip)
}
# “http://mini.browser.360.cn/area/getlocation”是一个查询IP的接口
# 请求成功则返回获取到的代理IP
# 失败则延时2秒并重试
requests.get("http://mini.browser.360.cn/area/getlocation",verify=False,proxies=proxies,timeout=3)
return ip
except:
time.sleep(2)
continue
elif '白名单' in r['msg']:
r_host = re.search("(d{1,3}.d{1,3}.d{1,3}.d{1,3})", str(r['msg'])).group(0)
requests.get(white + r_host, verify=False).text
continue
elif '请求太频繁' in r['msg']:
time.sleep(2)
continue
except:
time.sleep(2)
continue以上代理实现了对代理IP api接口的请求,但在初始使用中需要根据具体API返回的数据格式进行修改才能正常使用。
由于代理IP的连接稳定性受网络环境合适位置等多种因素影响,对于一些不稳定的代理IP是否可用需要进行判断和识别。而为了增加代理IP的可用性,我们还通过设置请求超时时间和User-Agent等参数来提高请求的成功率。