title: 爬蟲日記-采集 快代理 免費(fèi) 代理ip 并 清洗 ip
tags: ['requests','python','lxml','代理ip','proxy']
date: 2021-12-08
categories: "磨刀不誤砍柴工"
環(huán)境
window10
python3
使用到的庫
requests 網(wǎng)絡(luò)請(qǐng)求
lxml 網(wǎng)頁源碼解析
[TOC]
摘要
寫爬蟲被封ip是很正常的,所以代理ip也是爬蟲生活必不可少的一部分溉贿,今天寫一個(gè)網(wǎng)絡(luò)上公開的免費(fèi)的代理ip帆吻。
首先理一下邏輯祭芦,我要先寫一個(gè)爬蟲,去把網(wǎng)站上的公開的代理ip給采集過來,然后保險(xiǎn)起見蒂窒,對(duì)數(shù)據(jù)進(jìn)行一定的清洗,獲得可以使用的ip荞怒。
ok洒琢,開始寫爬蟲。
1 采集代理ip
1.1 觀察目標(biāo)網(wǎng)頁
快代理免費(fèi)ip展示的數(shù)據(jù)如下:
而我們程序進(jìn)行網(wǎng)絡(luò)訪問所需要的部分為ip
褐桌、port
衰抑、類型
,舉個(gè)例子:
url = "https://www.baidu.com"
proxies = {'http': "http://111.231.86.149:7890"}
requests.get(href, proxies=proxies)
所以我們要采集的就是每個(gè)代理ip的ip、port荧嵌、類型呛踊。
1.2 采集
爬蟲很簡單,直接上代碼啦撮。
# 目標(biāo)網(wǎng)址
url = "https://www.kuaidaili.com/free/"
payload = {}
# 構(gòu)造請(qǐng)求頭
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
'Accept': 'application/json, text/javascript, */*; q=0.01',
}
# 獲取網(wǎng)頁源碼
response = requests.request("GET", url, headers=headers, data=payload)
# 存放結(jié)果的列表
res = []
_ = etree.HTML(response.text)
# 格式化代理的中間變量
type_dct = {
"HTTP": "http://",
"HTTPS": "https://"
}
data_list = _.xpath("http://tbody/tr")
for data in data_list:
# 獲取ip
ip = data.xpath("./td[1]/text()")[0]
port = data.xpath("./td[2]/text()")[0]
type = data.xpath("./td[4]/text()")[0]
# 存到結(jié)果中
res.append(type_dct[type] + ip + ':' + port)
print(res)
2 清洗代理
2.1 目的及原理
畢竟是網(wǎng)絡(luò)上公開的數(shù)據(jù)谭网,要是百分百好用的話,那為什么還要有付費(fèi)的代理呢赃春。
直接獲取到的代理一般會(huì)有一定的時(shí)效愉择,真假的缺陷,直接放進(jìn)項(xiàng)目中去用的話织中,效率可能堪憂锥涕,所以在使用之前,最好對(duì)獲取到的代理進(jìn)行一定的清洗狭吼,獲取暫時(shí)有效的代理层坠。
清洗的方法也很簡單,就是檢測這個(gè)代理是否有效搏嗡。
我們可以構(gòu)造一個(gè)請(qǐng)求窿春,用這個(gè)代理去進(jìn)行訪問拉一,如果能訪問的到,拿得到數(shù)據(jù)旧乞,那這個(gè)代理暫時(shí)是有效的蔚润,可以放到項(xiàng)目中去使用,如果直接404或者其他的一些問題出現(xiàn)尺栖,那這個(gè)代理可能已經(jīng)壞了嫡纠,或者質(zhì)量不行,就直接放棄延赌。
2.2 清洗ip的代碼
if 'https' in proxy:
proxies = {'https': proxy}
else:
proxies = {'http': proxy}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4396.0 Safari/537.36'
}
try:
r = requests.get(href, proxies=proxies, timeout=5, headers=headers)
if r.status_code == 200:
print "代理有效"
except:
print "代理失效"
3 完善代碼
import requests
from lxml import etree
# 獲取快代理首頁的代理
def get_proxy_list():
url = "https://www.kuaidaili.com/free/"
payload = {}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
'Accept': 'application/json, text/javascript, */*; q=0.01',
}
response = requests.request("GET", url, headers=headers, data=payload)
res = []
_ = etree.HTML(response.text)
type_dct = {
"HTTP": "http://",
"HTTPS": "https://"
}
data_list = _.xpath("http://tbody/tr")
for data in data_list:
ip = data.xpath("./td[1]/text()")[0]
port = data.xpath("./td[2]/text()")[0]
type = data.xpath("./td[4]/text()")[0]
res.append(type_dct[type] + ip + ':' + port)
return res
# 測試代理
def check(proxy):
if 'https' in proxy:
proxies = {'https': proxy}
else:
proxies = {'http': proxy}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4396.0 Safari/537.36'
}
try:
r = requests.get(href, proxies=proxies, timeout=5, headers=headers)
if r.status_code == 200:
return True
except:
return False
if __name__ == '__main__':
proxy_list = get_proxy_list()
print(proxy_list)
for p in proxy_list:
print(p, check(p))
寫在最后
代碼并不完善除盏,直接應(yīng)用到像樣的項(xiàng)目上還是不行的,也沒有做一些奇怪操作挫以、情況的處理者蠕,只是提供一個(gè)思路和一個(gè)demo。
實(shí)力有限掐松,才疏學(xué)淺踱侣,如有錯(cuò)誤,歡迎指正大磺。
- 我的個(gè)人博客 菜貓子小六 - 博客 (codesix.site)
- 我的簡書 菜貓子小六 - 簡書 (jianshu.com)
- 我的CSDN 菜貓子小六 - CSDN