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
发布评论