教你⾃⼰搭建⼀个ip池(绝对超好⽤)
随着我们爬⾍的速度越来越快,很多时候,有⼈发现,数据爬不了啦,打印出来⼀看。
不返回数据,⽽且还甩⼀句话
是不是很熟悉啊?
要想想看,⼈是怎么访问⽹站的? 发请求,对,那么就会带有
request.headers,
那么当你疯狂请求别⼈的⽹站时候,⼈家⽹站的管理⼈员就会 觉得有点不对劲了,
他看看请求的 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是什么?后⾯补充知识点)
图⽰:
上⾯⼏个重要点解释如下:
Requests Headers:
· “吾是⼈!”——修改user-agent:⾥⾯储存的是系统和浏览器的型号版本,通过修改它来假装⾃⼰是⼈。
· “我从台湾省来”——修改referer:告诉服务器你是通过哪个⽹址点进来的⽽不是凭空出现的,有些⽹站会检查。
· “饼⼲!”:——带上cookie,有时带不带饼⼲得到的结果是不同的,试着带饼⼲去“贿赂”服务器让她给你完整的信息。
3.headers的伪装—随机User-Agent
爬⾍机制:很多⽹站都会对Headers的User-Agent进⾏检测,还有⼀部分⽹站会对Referer进⾏检测(⼀些资源⽹站的防盗链就是检测Referer)
随机User-Agent⽣成 :⽣成⼀个随机的User-Agent,这样你就可以是很多不同的浏览器模样。
(代码现成的,复制拿去⽤即可)
#!/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)
le)
print(ua.firefox)
gzip是什么文件夹print(ua.safari)
# 随机打印⼀个浏览器的User-Agent
print(ua.random)
print('完毕。')
# 2.在⼯作中常⽤的则是ua.random⽅式
import requests
ua = UserAgent()
print(ua.random)# 随机产⽣
headers ={
'User-Agent': ua.random # 伪装
}
# 请求
url ='www.baidu/'
response = (url, headers=headers)
print(response.status_code)
Referer的伪装:
如果想爬图⽚,图⽚反盗链的话就要⽤到Referer了。
headers = {‘User-Agent’:ua.random,‘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代理==模拟⼀个ip地址去访问某个⽹站(爬的次数太多,ip被屏蔽)
# 多线程的⽅式构造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
}
# page是我们需要获取多少页的ip,这⾥我们获取到第9页
for page in range(1,10):
# 通过观察URL,我们发现原⽹址+页码就是我们需要的⽹址了,这⾥的page需要转换成str类型
urls = url +str(page)
# 通过requests来获取⽹页源码
rsp = (urls, headers=headers)
html =
# 通过BeautifulSoup,来解析html页⾯
soup = BeautifulSoup(html,'html.parser')
# 通过分析我们发现数据在 id为ip_list的table标签中的tr标签中
trs = soup.find('table',id='ip_list').find_all('tr')# 这⾥获得的是⼀个list列表
# 我们循环这个列表
for item in trs[1:]:
# 并⾄少出每个tr中的所有td标签
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|%s\n'%(nation, ip, port, locate, anony, protocol, speed, time))
def verifyProxyList():
verifiedFile =open('','a')
while True:
lock.acquire()
ll = adline().strip()
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")
else:
print("---Failure失败:"+ ip +":"+ port)
def verifyProxy(ip):
'''
验证代理的有效性
'''
ua = UserAgent()
requestHeader ={
'User-Agent': ua.random
}
url ="www.baidu"
# 填写代理地址
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 = de()
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("www.xicidaili/nn/")
getProxy("www.xicidaili/nt/")
getProxy("www.xicidaili/wn/")
getProxy("www.xicidaili/wt/")
all_thread =[]
for i in range(30):
t = threading.Thread(target=verifyProxyList)
all_thread.append(t)
t.start()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论