IP代理
阿新 • • 發佈:2021-01-21
在我們編寫爬蟲的過程中,有些網站具有反爬措施,這是就需要我們設定代理ip
IP代理基本簡介
常用IP測試網站:
http://myip.ipip.net/
http://httpbin.org/get
常用IP代理網站:
西拉免費代理IP
快代理
89免費代理
全網代理IP
ip池設定格式
proxies = {
'http': 'http://113.238.142.208:3128',
'https': 'https://113.238.142.208:3128',
}
這裡添加了 http 和 https 兩個代理,這樣寫是因為有些網頁採用 http 協議,有的則是採用 https 協議,為了在這兩類網頁上都能順利使用代理,所以一般都同時寫上,當然,如果確定了某網頁的請求型別,可以只寫一種。
有無IP代理的區別
import requests
url='http://myip.ipip.net/'
proxies = {
'http': 'http://113.238.142.208:3128',
'https': 'https://113.238.142.208:3128',
}
try:
response = requests.get(url) #不使用代理
# response=requests.get(url,proxies=proxies,timeout=3)# 使用代理
print(response. status_code)
if response.status_code == 200:
print(response.text)
except requests.ConnectionError as e:
print(e.args)
不使用ip代理時:
使用IP代理:
使用西拉免費代理IP搭建
import requests
import random
import time
from lxml import etree
from fake_useragent import UserAgent
from multiprocessing.dummy import Pool
import os
class IpPool:
def __init__(self):
if os.path.exists("ip_pool.txt"):
os.remove("ip_pool.txt")
print('刪除檔案成功')
else:
print("The file does not exist")
# 測試ip是否可用url
self.test_url = 'http://httpbin.org/get'
# 獲取IP的 目標url
self.url = 'http://www.xiladaili.com/gaoni/{}/'
self.headers = {'User-Agent': UserAgent().random}
# 儲存可用ip
# self.file = open('ip_pool.txt', 'a')
self.ip_list=[]
def get_html(self, url):
'''獲取頁面'''
html = requests.get(url=url, headers=self.headers).text
return html
def get_proxy(self, url):
'''資料處理 獲取ip 和埠'''
html = self.get_html(url=url)
# print(html)
elemt = etree.HTML(html)
ip_ports_list = elemt.xpath('/html/body/div/div[3]/div[2]/table/tbody/tr/td[1]/text()')
self.ip_list.extend(ip_ports_list)
pool=Pool()
pool.map(self.test_proxy,self.ip_list)
def test_proxy(self, proxy):
'''測試代理IP是否可用'''
proxies = {
'http': 'http://{}'.format(proxy),
'https': 'https://{}'.format(proxy),
}
# 引數型別
# proxies
# proxies = {'協議': '協議://IP:埠號'}
# timeout 超時設定 網頁響應時間3秒 超過時間會丟擲異常
try:
resp = requests.get(url=self.test_url, proxies=proxies, headers=self.headers, timeout=3)
# 獲取 狀態碼為200
if resp.status_code == 200:
print('\n',proxy, '\033[31m可用\033[0m')
# 可以的IP 寫入文字以便後續使用
with open('ip_pool.txt', 'a') as f:
f.write(proxy+'\n')
else:
print(proxy, '不可用')
except Exception as e:
print(proxy, '不可用')
def crawl(self):
'''執行函式'''
# 快代理每頁url 的區別
# https://www.kuaidaili.com/free/inha/1/
# https://www.kuaidaili.com/free/inha/2/
# .......
# 提供的免費ip太多
# 這裡只獲取前100頁提供的免費代理IP測試
for i in range(1, 101):
# 拼接完整的url
print('正在獲取第{}頁IP'.format(i))
page_url = self.url.format(i)
# 注意抓取控制頻率
# time.sleep(random.randint(1, 4))
self.get_proxy(url=page_url)
# 執行完畢關閉文字
# self.file.close()
if __name__ == '__main__':
ip = IpPool()
ip.crawl()
使用快代理搭建代理IP池
import requests
import random
import time
from lxml import etree
from fake_useragent import UserAgent
from multiprocessing.dummy import Pool
class IpPool:
def __init__(self):
# 測試ip是否可用url
self.test_url = 'http://httpbin.org/get'
# 獲取IP的 目標url
self.url = 'https://www.89ip.cn/index_{}.html'
self.headers = {'User-Agent': UserAgent().random}
# 儲存可用ip
# self.file = open('ip_pool.txt', 'a')
self.ip_list=[]
def get_html(self, url):
'''獲取頁面'''
html = requests.get(url=url, headers=self.headers).text
return html
def get_proxy(self, url):
'''資料處理 獲取ip 和埠'''
html = self.get_html(url=url)
# print(html)
elemt = etree.HTML(html)
ips_list = elemt.xpath('//table/tbody/tr/td[1]/text()')
ports_list = elemt.xpath('//table/tbody/tr/td[2]/text()')
for ip, port in zip(ips_list, ports_list):
# 拼接ip與port
proxy = ip.strip() + ":" + port.strip()
# print(proxy)
# 175.44.109.195:9999
self.ip_list.append(proxy)
pool=Pool()
pool.map(self.test_proxy,self.ip_list)
def test_proxy(self, proxy):
'''測試代理IP是否可用'''
proxies = {
'http': 'http://{}'.format(proxy),
'https': 'https://{}'.format(proxy),
}
# 引數型別
# proxies
# proxies = {'協議': '協議://IP:埠號'}
# timeout 超時設定 網頁響應時間3秒 超過時間會丟擲異常
try:
resp = requests.get(url=self.test_url, proxies=proxies, headers=self.headers, timeout=3)
# 獲取 狀態碼為200
if resp.status_code == 200:
print('\n',proxy, '\033[31m可用\033[0m')
# 可以的IP 寫入文字以便後續使用
with open('ip_pool.txt', 'a') as f:
f.write(proxy+'\n')
else:
print(proxy, '不可用')
except Exception as e:
print(proxy, '不可用')
def crawl(self):
'''執行函式'''
# 快代理每頁url 的區別
# https://www.kuaidaili.com/free/inha/1/
# https://www.kuaidaili.com/free/inha/2/
# .......
# 提供的免費ip太多
# 這裡只獲取前100頁提供的免費代理IP測試
for i in range(1, 101):
# 拼接完整的url
print('正在獲取第{}頁IP'.format(i))
page_url = self.url.format(i)
# 注意抓取控制頻率
# time.sleep(random.randint(1, 4))
self.get_proxy(url=page_url)
# 執行完畢關閉文字
# self.file.close()
if __name__ == '__main__':
ip = IpPool()
ip.crawl()
專案實戰:使用代理IP爬取美團商家評論
import requests,time,random,csv
from fake_useragent import UserAgent
from lxml import etree
starttime = time.time()#記錄開始時間
ips = [] #裝載有效 IP
for i in range(1, 2):
headers = {
"User-Agent" : UserAgent().chrome #chrome瀏覽器隨機代理
}
ip_url = 'http://www.xiladaili.com/gaoni/{}/'.format(i)
html = requests.get(url=ip_url, headers=headers).text
seletor=etree.HTML(html)
ip_list=seletor.xpath('/html/body/div/div[3]/div[2]/table/tbody/tr/td[1]/text()')
for i in range(len(ip_list)):
ip = "http://" + ip_list[i]
# 設定為字典格式
proxies = {"http": ip}
#使用上面的IP代理請求百度,成功後狀態碼200
baidu = requests.get("https://www.baidu.com/", proxies = proxies)
if baidu.status_code == 200:
ips.append(proxies)
print ("正在準備IP代理,請稍後。。。")
#建立CSV檔案,並寫入表頭資訊,並設定編碼格式為“utf-8-sig”防止中文亂碼
fp = open('./美團_大學城.csv','a', newline='',encoding='utf-8-sig') #"./"表示當前資料夾,"a"表示新增
writer = csv.writer(fp) #方式為寫入
writer.writerow(('使用者ID','使用者名稱', '平均價','評論','回覆')) #表頭
for page in range(0, 515, 10):#0~100
url = "https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=2ff7056c-9d76-424c-b564-b7084f7e16e4&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F193383554%2F&riskLevel=1&optimusCode=10&id=193383554&userId=&offset={}&pageSize=10&sortType=1".format(page)
headers = {
"User-Agent" : UserAgent().chrome #chrome瀏覽器隨機代理
}
proxy=ips[random.randint(0 , len(ips)-1)]
print(proxy)
respone = requests.get(url = url, headers = headers,proxies=proxy) #向伺服器發出請求,伺服器返回結果
for item in respone.json()['data']['comments']:#遍歷,迴圈
userId = item['userId']#評論者id
userName = item['userName']#評論人暱稱
avgPrice = item['avgPrice']
comment = item['comment']#評論內容
merchantComment = item['merchantComment']#商家回覆
data = (userId, userName, avgPrice, comment, merchantComment)
writer.writerow((data))
fp.close() #關閉檔案
endtime = time.time()#獲取結束時間
sumTime = endtime - starttime #總的時間
print ("一共用的時間是%s秒"%sumTime)
參考資料:https://blog.csdn.net/ayouleyang/article/details/104453540