前言
使用爬蟲爬取網(wǎng)站的信息常常會(huì)遇到的問題是,你的爬蟲行為被對(duì)方識(shí)別了,對(duì)方把你的IP屏蔽了,返回不了正常的數(shù)據(jù)給你。那么這時(shí)候就需要使用代理服務(wù)器IP來偽裝你的請(qǐng)求了。
免費(fèi)代理服務(wù)器網(wǎng)站有:
下面我們以西刺免費(fèi)代理IP為例子看看是如何獲取可用IP的。主要分為以下幾個(gè)步驟:
- 請(qǐng)求url,獲取網(wǎng)頁數(shù)據(jù)
- 解析網(wǎng)頁數(shù)據(jù),找到包含【IP地址】和【端口】信息的節(jié)點(diǎn),解析出這兩個(gè)數(shù)據(jù)
- 驗(yàn)證取得的【IP地址】和【端口】信息是否可用
- 將驗(yàn)證可用的【IP地址】和【端口】信息保存起來(暫存到列表,或保存到文件,保存到數(shù)據(jù)庫)
1. 請(qǐng)求網(wǎng)頁數(shù)據(jù)
請(qǐng)求網(wǎng)頁數(shù)據(jù)是使用requests庫去做網(wǎng)絡(luò)請(qǐng)求的,填入url,和header頭部信息,使用get請(qǐng)求方式去請(qǐng)求,得到response相應(yīng)后,返回response.text即是響應(yīng)的文本內(nèi)容,即網(wǎng)頁文本內(nèi)容。
# 請(qǐng)求url,獲取網(wǎng)頁數(shù)據(jù)
def _requestUrl(index):
src_url = 'http://www.xicidaili.com/nt/'
url = src_url + str(index)
if index == 0:
url = src_url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
}
response = requests.get(url, headers=headers)
return response.text
用瀏覽器打開網(wǎng)址看一下

2. 解析網(wǎng)頁數(shù)據(jù)
返回正確的網(wǎng)頁數(shù)據(jù)之后,就可以開始對(duì)它進(jìn)行解析了,這里使用BeautifulSoup庫進(jìn)行網(wǎng)頁內(nèi)容解析。如果是Chrome瀏覽器,按f12可以查看網(wǎng)頁源碼,如圖

找到某個(gè)tr行,第1個(gè)和第2個(gè)td列就是是ip和端口信息,因此我們可以用BeautifulSoup查找所以的tr行,再查找該tr行的第1個(gè)和第2個(gè)td列即可以獲取該頁面上所有的ip和端口信息了。
# 解析網(wǎng)頁數(shù)據(jù),獲取ip和端口信息
def parseProxyIpList(content):
list = []
soup = BeautifulSoup(content, 'html.parser')
ips = soup.findAll('tr')
for x in range(1, len(ips)):
tds = ips[x].findAll('td')
ip_temp = 'http://' + tds[1].contents[0] + ':' + tds[2].contents[0]
print('發(fā)現(xiàn)ip:%s' % ip_temp)
list.append(ip_temp)
return list
3. 驗(yàn)證IP和端口是否可用
解析到頁面上的所有ip和端口信息后,還需要驗(yàn)證它是否是有效的,然后對(duì)它們進(jìn)行過濾,獲取有效的ip列表。驗(yàn)證方法就是使用它作為代理地址,去請(qǐng)求網(wǎng)絡(luò),看是否能請(qǐng)求成功,如果請(qǐng)求成功,說明是有效的。當(dāng)然,這里需要加上超時(shí)時(shí)間,以避免等待時(shí)間過長,這里設(shè)置超時(shí)時(shí)間為5秒。
# 過濾有效的ip信息
def filterValidProxyIp(list):
print('開始過濾可用ip 。。。')
validList = []
for ip in list:
if validateIp(ip):
print('%s 可用' % ip)
validList.append(ip)
else:
print('%s 無效' % ip)
return validList
# 驗(yàn)證ip是否有效
def validateIp(proxy):
proxy_temp = {"http": proxy}
url = "http://ip.chinaz.com/getip.aspx"
try:
response = requests.get(url, proxies=proxy_temp, timeout=5)
return True
except Exception as e:
return False
4. 發(fā)起請(qǐng)求,保存可用IP和端口信息
接下來要開始調(diào)用以上代碼了。這里只爬取第1頁數(shù)據(jù)
# 獲取可用的代理ip列表
def getProxyIp():
allProxys = []
startPage = 0
endPage = 1
for index in range(startPage, endPage):
print('查找第 %s 頁的ip信息' % index)
# 請(qǐng)求url,獲取網(wǎng)頁數(shù)據(jù)
content = _requestUrl(index)
# 解析網(wǎng)頁數(shù)據(jù),獲取ip和端口信息
list = parseProxyIpList(content)
# 過濾有效的ip信息
list = filterValidProxyIp(list)
# 添加到有效列表中
allProxys.append(list)
print('第 %s 頁的有效ip有以下:' % index)
print(list)
print('總共找到有效ip有以下:')
print(allProxys)
return allProxys
運(yùn)行該爬蟲程序之后,就可以開始爬取代理服務(wù)器信息了。如圖



總結(jié)
通過以上步驟就可以獲取有效的代理服務(wù)器IP信息了,其他代理服務(wù)器IP網(wǎng)站的獲取方式和這個(gè)大同小異,主要在于解析網(wǎng)頁數(shù)據(jù)那里,需要找到包含IP和端口數(shù)據(jù)的標(biāo)簽,然后解析獲取到。有了代理服務(wù)器IP,你就可以爬取更多網(wǎng)站的信息了。
還有個(gè)問題是,網(wǎng)站可能會(huì)對(duì)某個(gè)IP檢測,如果超過一定請(qǐng)求次數(shù),就會(huì)對(duì)其進(jìn)行屏蔽,那這樣會(huì)導(dǎo)致程序中斷,無法獲取所有的信息,這如何解決呢?歡迎關(guān)注我的微信公眾號(hào)hesong,了解具體應(yīng)對(duì)方式。
附上源碼地址