日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

获得代理ippython_Python搭建代理IP池实现获取IP的方法

發布時間:2025/3/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获得代理ippython_Python搭建代理IP池实现获取IP的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用爬蟲時,大部分網站都有一定的反爬措施,有些網站會限制每個 IP 的訪問速度或訪問次數,超出了它的限制你的 IP 就會被封掉。對于訪問速度的處理比較簡單,只要間隔一段時間爬取一次就行了,避免頻繁訪問;而對于訪問次數,就需要使用代理 IP 來幫忙了,使用多個代理 IP 輪換著去訪問目標網址可以有效地解決問題。

目前網上有很多的代理服務網站提供代理服務,也提供一些免費的代理,但可用性較差,如果需求較高可以購買付費代理,可用性較好。

因此我們可以自己構建代理池,從各種代理服務網站中獲取代理 IP,并檢測其可用性(使用一個穩定的網址來檢測,最好是自己將要爬取的網站),再保存到數據庫中,需要使用的時候再調用。

本文介紹的則是構建代理 IP 池的第一步:獲取 IP

使用的庫:requests、pyquery

幾個能提供免費代理的代理服務網站(排名不分先后):

廠商名稱

地址

66代理

http://www.66ip.cn/

西刺代理

https://www.xicidaili.com

全網代理

http://www.goubanjia.com

云代理

http://www.ip3366.net

IP海

http://www.iphai.com

快代理

https://www.kuaidaili.com

免費代理IP庫

http://ip.jiangxianli.com

代理服務網站 Crawler

代理獲取的相關代碼,把從每個網站提取 IP 的方法都放到一起,然后運行時只要調用相關方法即可

為了實現靈活,將獲取代理的一個個方法統一定義一個規范,如統一定義以 crawl 開頭,這樣擴展的時候只需要添加 crawl 開頭的方法即可

在這里實現了幾個示例,如抓取代理 66、西刺代理、云代理、快代理 四個免費代理網站,這些方法都定義成生成器,通過 yield 返回。首先將網頁獲取,然后用 PyQuery 解析,解析出 IP 加端口形式的代理再返回

crawler.py

import json

import re

from utils import get_page

from pyquery import PyQuery as pq

# 元類

class ProxyMetaclass(type):

def __new__(cls, name, bases, attrs):

count = 0

attrs['__CrawlFunc__'] = []

for k, v in attrs.items():

if 'crawl_' in k:

attrs['__CrawlFunc__'].append(k)

count += 1

attrs['__CrawlFuncCount__'] = count

return type.__new__(cls, name, bases, attrs)

class Crawler(object, metaclass=ProxyMetaclass):

def get_proxies(self, callback):

proxies = []

for proxy in eval("self.{}()".format(callback)):

print('成功獲取到代理', proxy)

proxies.append(proxy)

return proxies

def crawl_daili66(self, page_count=4):

start_url = 'http://www.66ip.cn/{}.html'

urls = [start_url.format(page) for page in range(1, page_count + 1)]

for url in urls:

print('Crawling', url)

html = get_page(url)

if html:

doc = pq(html)

trs = doc('.containerbox table tr:gt(0)').items()

for tr in trs:

ip = tr.find('td:nth-child(1)').text()

port = tr.find('td:nth-child(2)').text()

yield ':'.join([ip, port])

def crawl_xicidaili(self):

for i in range(1, 3):

start_url = 'http://www.xicidaili.com/nn/{}'.format(i)

headers = {

'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

'Host':'www.xicidaili.com',

'Referer':'http://www.xicidaili.com/nn/3',

'Upgrade-Insecure-Requests':'1',

}

html = get_page(start_url, options=headers)

if html:

find_trs = re.compile('

(.*?)', re.S)

trs = find_trs.findall(html)

for tr in trs:

find_ip = re.compile('

(\d+\.\d+\.\d+\.\d+)')

re_ip_address = find_ip.findall(tr)

find_port = re.compile('

(\d+)')

re_port = find_port.findall(tr)

for address,port in zip(re_ip_address, re_port):

address_port = address+':'+port

yield address_port.replace(' ','')

def crawl_ip3366(self):

for i in range(1, 4):

start_url = 'http://www.ip3366.net/?stype=1&page={}'.format(i)

html = get_page(start_url)

if html:

find_tr = re.compile('

(.*?)', re.S)

trs = find_tr.findall(html)

for s in range(1, len(trs)):

find_ip = re.compile('

(\d+\.\d+\.\d+\.\d+)')

re_ip_address = find_ip.findall(trs[s])

find_port = re.compile('

(\d+)')

re_port = find_port.findall(trs[s])

for address,port in zip(re_ip_address, re_port):

address_port = address+':'+port

yield address_port.replace(' ','')

def crawl_kuaidaili(self):

for i in range(1, 4):

start_url = 'http://www.kuaidaili.com/free/inha/{}/'.format(i)

html = get_page(start_url)

if html:

ip_address = re.compile('

(.*?)')

re_ip_address = ip_address.findall(html)

port = re.compile('

(.*?)')

re_port = port.findall(html)

for address,port in zip(re_ip_address, re_port):

address_port = address+':'+port

yield address_port.replace(' ','')

定義了一個 ProxyMetaclass,Crawl 類將它設置為元類,元類中實現了 new() 方法,遍歷 attrs 變量即可獲取類的所有方法信息,判斷方法名前面是否是 crawl,是則將其加入到 CrawlFunc 屬性中

代理網站的添加非常靈活,不僅可以添加免費代理,也可以添加付費代理,一些付費代理的提取方式類似,也通過 Web 的形式獲取再進行解析,解析方式可能更加簡單,如解析純文本或 Json,解析之后以同樣的方式返回,可以自行擴展

utils.py

import requests

from requests.exceptions import ConnectionError

base_headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',

'Accept-Encoding': 'gzip, deflate, sdch',

'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'

}

def get_page(url, options={}):

headers = dict(base_headers, **options)

print('正在抓取', url)

try:

response = requests.get(url, headers=headers)

print('抓取成功', url, response.status_code)

if response.status_code == 200:

return response.text

except ConnectionError:

print('抓取失敗', url)

return None

抓取網頁內容的方法,訪問鏈接成功后返回整個網頁 HTML 內容,便于后續對網頁具體內容的提取。封裝成一個方法,讓上面的 crawler 在抓取各個網站時調用

進行抓取

getter.py

from crawler import Crawler

from setting import *

import sys

class Getter():

def __init__(self):

self.crawler = Crawler()

def run(self):

print('獲取器開始執行')

for callback_label in range(self.crawler.__CrawlFuncCount__):

callback = self.crawler.__CrawlFunc__[callback_label]

# 獲取代理

all_ip = self.crawler.get_proxies(callback)

if __name__ == '__main__':

get = Getter()

get.run()

運行結果:

網站上的免費 IP 就被成功抓取下來了,至于能不能用,就有待驗證了

整個過程其實就是一個普通的爬蟲,而且沒什么反爬措施,能到用代理 IP 的地步,代碼里面的訪問、抓取部分的細節應該都看得懂

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的获得代理ippython_Python搭建代理IP池实现获取IP的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。