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