Python这么语言很多人刚开始的项目都是写个小爬虫,但是大家在写的时候发现经常会被目标网站给拒绝。
目标网站拒绝你千百遍,你待她依然如初恋。如何敲开初恋的大门,这里不得不说下代理IP。
因为很多网站为了拉新,不让老客户不停的访问(作了访问限制)。大家在拉数据的时候,需要每次替换不同的访问IP。这样目标网站会以为你是新用户,就会放你进去。
国内免费的代理IP网站,一般以西刺代理比较火。域名https://xicidaili.com/
一个一个的去替换,显示不出我们的身份,作为技术员,我们应该有我们的出场方式:
这里主要用到了以下几个技术:
1、requests。requests 主要是用来作网络传输用的。简单点来说就是你本机和目标网站通信之间的通道,是由它来负责的。
导入模块
#导入模块 这个模块不是默认的,需要使用pip 进行安装。
import requests
进行网络请求,这里使用的是get
#获得返回信息。 url是目标网址。这里是西刺代理的。 headers 是请求的头部构造
resp = requests.get(url, headers=req_header)
#判断返回的结果码是否是正常的。
if resp.status_code == requests.codes.ok:
2、lxml。它是一个解析库,支持HTML和XML的解析,支持XPath解析方式。用来进行对返回的信息进行解析。获取到你需要的信息。你可以简单理解为它为DOM对象。
selector = etree.HTML(resp.text)
#Xpath解析返回的html对象拼接成数组
td_data = [i.xpath("td/text()") for i in selector.xpath('//table[@id="ip_list"]/tr')[1:] ]
#进行返回值的筛选拼接
ip_list += [ [data[5].strip(),"".join([data[0],":",data[1]])] for data in td_data if data[5].strip().lower() == 'https']
最终结果如下:
下面是代码全部:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
from lxml import etree
#获取代理列表
def get_proxy_ip(proxy_url_type="http"):
if proxy_url_type=="https":
url = "https://www.xicidaili.com/wn/"
else:
url = "https://www.xicidaili.com/wt/"
req_headers = [
{ "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
},
{ "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
},
]
# 获取最后一页,这个地方偷懒了,没有去计算,而是直接打开页面看有多少页就写上去了
#有兴趣的可以自己使用Xpath 去计算一下。
last_page_num = 4049
arr_index = random.randint(1, len(req_headers) - 1)
req_header = req_headers[arr_index]
#IP存放列表
p_list = []
for i in range(1, last_page_num):
#访问地址
url +=str(i)
#获得返回信息。 url是目标网址。这里是西刺代理的。 headers 是请求的头部构造
resp = requests.get(url, headers=req_header)
#判断返回的结果码是否是正常的。
if resp.status_code == requests.codes.ok:
selector = etree.HTML(resp.text)
#tr_data = selector.xpath('//table[@id="ip_list"]/tr')
td_data = [i.xpath("td/text()") for i in selector.xpath('//table[@id="ip_list"]/tr')[1:] ]
ip_list += [ [data[5].strip(),"".join([data[0],":",data[1]])] for data in td_data if data[5].strip().lower() == 'https']
time.sleep(1)
return ip_list
if __name__ == '__main__':
proxy_ips = get_proxy_ip("https")
print(proxy_ips)
pass