2023年11月27日发(作者:)

教你⾃⼰搭建⼀个ip池(绝对超好⽤)

随着我们爬⾍的速度越来越快,很多时候,有⼈发现,数据爬不了啦,打印出来⼀看。

不返回数据,⽽且还甩⼀句话

是不是很熟悉啊?

要想想看,⼈是怎么访问⽹站的? 发请求,对,那么就会带有

s,

那么当你疯狂请求别⼈的⽹站时候,⼈家⽹站的管理⼈员就会 觉得有点不对劲了,

他看看请求的 header 信息,⼀看吓⼀跳,结果看到的 headers 信息是这样的:

Host: 127.0.0.1:3369

User-Agent: python-requests/3.21.0

Accept-Encoding: gzip, deflate

Accept: */*

Connection: keep-alive

看到:

User-Agent: python-requests/3.21.0

居然使⽤ python 的库来请求,说明你已经暴露了,⼈家不封你才怪呢?

那么怎么办呢?伪装⾃⼰呗。

python 不可以伪装,浏览器可以伪装,所以可以修改浏览器的请求头。

简单来说,就是让⾃⼰的 python 爬⾍假装是浏览器。

2. 伪装 Header的哪个地⽅?

要让⾃⼰的 python 爬⾍假装是浏览器,我们要伪装headers,那么headers⾥⾯有很多字段,我们主要注意那⼏个呢?

headers数据通常⽤这两个即可,强烈推荐在爬⾍中为每个request都配个user-agent,⽽’Referer’如果需要就加,不需要就不⽤。

(Referer是什么?后⾯补充知识点)

图⽰:

#!/usr/bin/python3

#@Readme : headers

反爬之的伪装

# Headers

对于检测的反爬⾍

from fake_useragent import UserAgent # pip install fake-useragent

下载:

ua = UserAgent() # -

实例化,需要联⽹但是⽹站不太稳定可能耗时会长⼀些

# 1.

⽣成指定浏览器的请求头

print(ua.ie)

print(ua.opera)

print(ua.chrome)

print(ua.google)

print(ua.firefox)

print(ua.safari)

# User-Agent

随机打印⼀个浏览器的

print(ua.random)

print('完毕。')

# 2.

在⼯作中常⽤的则是⽅式

import requests

ua = UserAgent()

print(ua.random) #

随机产⽣

headers = {

'User-Agent': ua.random #

伪装

}

#

请求

url = '/'

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

print(response.status_code)

Referer的伪装:

如果想爬图⽚,图⽚反盗链的话就要⽤到Referer了。

headers = {‘User-Agent’:,‘Referer’:‘这⾥放⼊图⽚的主页⾯’}

如果遇到防盗链的图⽚,⼀般思路就是先爬到所有图⽚的地址.jpg —–>将它们储存在列表中 —–>遍历访问图⽚地址,然后⽤ ‘wb’的格

式打开⽂件写⼊,⽂件名根据图⽚地址动态改变。

这个基本上如果你的爬⾍对象不是很严肃的图⽚⽹站,都不会⽤到。

4.2.1 ⾃建的ip代理池

多线程爬⾍

就是⾃⼰去收集⽹上公开的免费ip,⾃建起 ⾃⼰的ip代理池。

就是通过 python 程序去抓取⽹上⼤量免费的代理 ip , 然后定时的去检测这些 ip 可不可以⽤,那么下次你要使⽤代理 ip 的时候,你只需

要去⾃⼰的 ip 代理池⾥⾯拿就⾏了。

简单来说:访问免费代理的⽹站 —> 正则/xpath提取 ip和端⼝—> 测试ip是否可⽤ 》》可⽤则保存 》》使⽤ip爬⾍ > 过期,抛弃ip。

这个过程可以使⽤多线程或异步的⽅式,因为检测代理是个很慢的过程。

这是来源于⽹络的⼀个西刺代理的多线程ip代理爬⾍:(我不⽤)

#!/usr/bin/python3

#@Readme : IP==ipip

代理模拟⼀个地址去访问某个⽹站(爬的次数太多,被屏蔽)

# ip

多线程的⽅式构造代理池。

from bs4 import BeautifulSoup

import requests

from urllib import request, error

from urllib import request, error

import threading

import os

from fake_useragent import UserAgent

inFile = open('') # ip

存放爬⾍下来的

verifiedtxt = open('') # ip

存放已证实的可⽤的

lock = threading.Lock()

def getProxy(url):

# txt

打开我们创建的⽂件

proxyFile = open('', 'a')

#

伪装

ua = UserAgent()

headers = {

'User-Agent': ua.random

}

# pageip

是我们需要获取多少页的,这⾥我们获取到第9页

for page in range(1, 10):

# +pagestr

通过观察URL,我们发现原⽹址页码就是我们需要的⽹址了,这⾥的需要转换成类型

urls = url + str(page)

# requests

通过来获取⽹页源码

rsp = requests.get(urls, headers=headers)

html = rsp.text

# BeautifulSouphtml

通过,来解析页⾯

soup = BeautifulSoup(html,'')

# idip_listtabletr

通过分析我们发现数据在 标签中的标签中

trs = soup.find('table', id='ip_list').find_all('tr') # list

这⾥获得的是⼀个列表

#

我们循环这个列表

for item in trs[1:]:

# trtd

并⾄少出每个中的所有标签

tds = item.find_all('td')

# img

我们会发现有些标签⾥⾯是空的,所以这⾥我们需要加⼀个判断

if tds[0].find('img') is None:

nation = '未知'

locate = '未知'

else:

nation = tds[0].find('img')['alt'].strip()

locate = tds[3].text.strip()

# td

通过列表⾥⾯的数据,我们分别把它们提取出来

ip = tds[1].text.strip()

port = tds[2].text.strip()

anony = tds[4].text.strip()

protocol = tds[5].text.strip()

speed = tds[6].find('div')['title'].strip()

time = tds[8].text.strip()

# txt

将获取到的数据按照规定格式写⼊⽂本中,这样⽅便我们获取

proxyFile.write('%s|%s|%s|%s|%s|%s|%s|%sn' % (nation, ip, port, locate, anony, protocol, speed, time))

def verifyProxyList():

verifiedFile = open('', 'a')

while True:

lock.acquire()

ll = inFile.readline().strip()

lock.release()

if len(ll) == 0: break

line = ll.strip().split('|')

line = ll.strip().split('|')

ip = line[1]

port = line[2]

realip = ip + ':' + port

code = verifyProxy(realip)

if code == 200:

lock.acquire()

print("---Success成功:" + ip + ":" + port)

verifiedFile.write(ll + "n")

lock.release()

else:

print("---Failure失败:" + ip + ":" + port)

def verifyProxy(ip):

'''

验证代理的有效性

'''

ua = UserAgent()

requestHeader = {

'User-Agent': ua.random

}

url = ""

#

填写代理地址

proxy = {'http': ip}

# proxyHandler

创建

proxy_handler = request.ProxyHandler(proxy)

#

创建opener

proxy_opener = request.build_opener(proxy_handler)

# opener

安装

request.install_opener(proxy_opener)

try:

req = request.Request(url, headers=requestHeader)

rsq = request.urlopen(req, timeout=5.0)

code = rsq.getcode()

return code

except error.URLError as e:

return e

if __name__ == '__main__':

#

⼿动新建两个⽂件

filename = ''

filename2 = ''

if not os.path.isfile(filename):

inFile = open(filename, mode="w", encoding="utf-8")

if not os.path.isfile(filename2):

verifiedtxt = open(filename2, mode="w", encoding="utf-8")

tmp = open('', 'w')

tmp.write("")

tmp.close()

tmp1 = open('', 'w')

tmp1.write("")

tmp1.close()

# ip

多线程爬⾍西刺代理⽹,找可⽤

getProxy("/nn/")

getProxy("/nt/")

getProxy("/wn/")

getProxy("/wt/")

all_thread = []

for i in range(30):

t = threading.Thread(target=verifyProxyList)

all_thread.append(t)

t.start()

t.start()

for t in all_thread:

t.join()

inFile.close()

verifiedtxt.close()

运⾏⼀下,效果:

爬出来的可⽤的很少或者很短:

重点来了

4.2.3 开源 ip代理池—ProxyPool(吐⾎推荐)

类⽐线程池,进程池,懂了吧?

这是俺发现的⼀个不错的开源 ip 代理池ProxyPool,可以⽤windows系统的,⾄少Python3.5以上环境哟,还需要将Redis服务开启。

现成的代理池,还不⽤起来?

ProxyPool下载地址:

(可以⼿动下载也可以使⽤git下来。)

ool的使⽤:

⾸先使⽤ git clone 将源代码拉到你本地,

3.进⼊proxypool⽬录,修改⽂件,PASSWORD为Redis密码,如果为空,则设置为None。(新装的redis⼀般没有密码。)

(如果你没 redis 的话,可以先去下载了安装了再来看吧。)

(假设你的redis已经安装完成。)

4.接着在你 clone 下来的⽂件⽬录中(就是这个ProxyPool存的电脑路径 )

直接cmd 打开dos窗⼝,运⾏:

图⽰:

http://0.0.0.0:5555/random

11.在代码中随机获取⼀个ip代理

就这样:

import requests

# ip

随机代理获取

PROXY_POOL_URL = 'localhost:5555/random'

def get_proxy():

try:

response = requests.get(PROXY_POOL_URL)

if response.status_code == 200:

return response.text

except ConnectionError:

return None

if __name__ == '__main__':

print(get_proxy())

好了。到此结束了。

使⽤这个 ip代理池,⽬前来说是最好的了,⼜免费⼜⾼效唉~~~

5.报错解决

安装的时候,如果报错类似于如下:

AttributeError: ‘int’ object has no attribute 'items

现在再从Redis Desktop Manager进⾏连接就可以成功了!

4)客户端测试:

127.0.0.1:6379> keys *

(empty list or set)

127.0.0.1:6379> auth redis //会报以下错误

(error) ERR Client sent AUTH, but no password is set

127.0.0.1:6379> CONFIG SET requirepass "redis" //执⾏此⾏指令即可解决错误

OK

127.0.0.1:6379> auth redis

OK

5.将Redis服务安装到本地服务

由于上述启动Redis服务器的⽅式有点复杂,且redis服务窗⼝不可关闭。故这⾥介绍如何将Redis服务安装到Windows系统的本地服务。

在cmd下输⼊以下命令:

redis-server --service-install redis.conf --loglevel verbose //安装redis本地服务,指定配置⽂件redis.windows.conf

6.如何卸载Redis本地服务

打开win系统命令⾏,依次输⼊下列命令:

C:Userslenovo>cd /d D:

D:>cd D:SoftWareRedis-3.0

D:SoftWareRedis-3.0> redis-server --service-uninstall