一.前言
兄弟们好,因为这几天都在学习深度学习,所以也是好几天没更新了,心里也是十分的愧疚,所以今天来给大家更新了(其实完全就是今天才想起来),今天给大家讲的就是添加代{过}{滤}理,让你做爬虫不至于一直都用一个IP来,而且教一下大家如何构建一个属于自己的代{过}{滤}理池,不换IP,极易被有反扒的网站封锁,所以这节很重要
二.首先我们要找到一个有很多免费代{过}{滤}理的网站,免费IP大多都是费的,不能用,但是我们作为白嫖党,我们就要从石头里面捡鸡蛋皮,我们筛选一下这些免费IP,然后我们自己存起来,当作自己的代{过}{滤}理池,然后使用它,有钱的话买个优质代{过}{滤}理也是可以的,下图就是免费代{过}{滤}理,我们要做的就是提取IP那一部分,这就要用到我们之前学过的知识了
三.用爬虫提取出免费IP
1.我们先拉到最下面,抓取一下它翻页的包,因为他有很多页呀,我们要筛选可以用的IP当然要越多越好啦,很明显呀,我们这个2就是页数的意思
2.先按照我这三步走,找到IP和端口的所在的地方,接下来我们分析一下,直接用td定位的话不好实现,因为我们只需要IP和PORT,接下来我给大家一种新的思路
3.正常的css语法表达式应该是:#list .table tbody tr td(在这里顺便复习一下之前说过的CSS写法,id用#,class用点.,剩下的用空格,因为id是唯一的,所以可以先找id,然后一步一步向下找),但这样我们找到的数据就太多了,我们就先用tr定位,然后取出列表,再根据列表索引取出IP和PORT,接下来我展示一下这部分代码,方便大家理解
[Python] 纯文本查看 复制代码 import requests
from bs4 import BeautifulSoup
import time
finally_IPs = [] #创建一个存放我们处理好的IP(36.250.156.241:9999这种格式)
for i in range(1,10): #这个是我们代表页数的一个循环,也就是这里我们爬取99页(1-99)
url = f'https://www.kuaidaili.com/free/inha/{i}/' #这个是f字符串,就是在字符串之前加f,就可以在后面用{}替换一些变量
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
html = requests.get(url = url,headers = headers) #访问网页
#print(html.text) #输出网页源代码
soup = BeautifulSoup(html.text,'lxml') #第一个参数放网页文本,第二个参数是lxml解析器
results = soup.select('#list .table tbody tr') #css语句放在引号中间,这样就能先取出tr
for result in results:
#print(result)
IP = result.select('td')[0].text #二次提取数据,定位td,取出第0个元素
print(IP)
PORT = result.select('td')[1].text #和上面同理,定位td,取出第一个元素
print(PORT)
finally_IP = IP + ':' + PORT
print(finally_IP)
finally_IPs.append(finally_IP) #给列表添加元素,一一添加进去
time.sleep(3) #太快会取不到,所以这里我们加3秒的延迟,这个需要导入time库,自带库
print(finally_IPs) #我们循环结束后,输出一下列表看看
结果图我们看一下
4.接下来就是验证可用性了,我们先介绍一个proxies参数,有 http 与 https 两种,在爬取不同网站时我们需要选用不同类型的网站时选用不同的 proxise,在不知道网站类型时可以将两种类型均放进去,requests 会自动选择合适的。
[Python] 纯文本查看 复制代码 for finally_IP in finally_IPs: #ip列表一一遍历
proxies = {
'http':'http://' + finally_IP,
'https':'https://' + finally_IP
}
try:
response = requests.get(url = 'http://www.baidu.com', headers = headers, proxies = proxies, timeout = 3)
#上面timeout是参数,表示如果三秒没有响应的话,我们就报错
if response.status_code == 200: #如果状态码为200,也就是正常访问的话就代表是可用IP
with open('Available.txt','w',encoding='utf_8_sig') as fp:
fp.write(finally_IP + '\n')
#上面两句是将可用IP存入本地
print("这是一个可用IP,已保存到本地")
else:
print("这是一个不可用IP")
except:
print("这是一个不可用IP")
四.这样就算写好了,但是我替大家试了10页,一个能用的都没,我心态都崩了,不过这个也是在意料之中,这个只是让大家了解这个过程,我还是建议大家买优质代{过}{滤}理,使用API调用,我把这个通用的代码也发出来给兄弟们看看
[Python] 纯文本查看 复制代码 import requests
def verify(proxy_IP):
print('proxy_IP:',proxy_IP)
proxy_IP = proxy_IP.strip().replace(' ','')
print('new_proxy_IP:',proxy_IP)
url = 'http://www.baidu.com/s?wd=python'
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36'
}
proxies = {
'http':'http://' + proxy_IP,
'https':'https://' + proxy_IP
}
html = requests.get(url = url,headers = headers,proxies = proxies)
print(html.text)
def IP():
api_url = requests.get('').text #引号中间加上代{过}{滤}理的API地址
api_url = api_url.replace('\n','')
print("获取到的IP为:",api_url)
return api_url
if __name__ =='__main__':
proxy_IP = IP()
verify(proxy_IP)
大家只需要把19行的API填写,然后从15,16行开始改成你的爬虫代码就行,这个我自定义了子程序,这样看起来简介点,没写注释,但是估计大家这么久了,理解起来也是轻轻松松
后言:大家有问题可以在评论问我,我会尽我最大的努力给大家解答,感谢你的观看 |