1. 程式人生 > 其它 >IP代理

IP代理

技術標籤:python爬蟲

在我們編寫爬蟲的過程中,有些網站具有反爬措施,這是就需要我們設定代理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