概述
用爬虫时,大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉。对于访问速度的处理比较简单,只要间隔一段时间爬取一次就行了,避免频繁访问;而对于访问次数,就需要使用代理 IP 来帮忙了,使用多个代理 IP 轮换着去访问目标网址可以有效地解决问题。
目前网上有很多的代理服务网站提供代理服务,也提供一些免费的代理,但可用性较差,如果需求较高可以购买付费代理,可用性较好。
因此我们可以自己构建代理池,从各种代理服务网站中获取代理 IP,并检测其可用性(使用一个稳定的网址来检测,最好是自己将要爬取的网站),再保存到数据库中,需要使用的时候再调用。
提供免费代理的网站
厂商名称 | 地址 |
---|---|
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 |
小幻代理 | https://ip.ihuan.me/ |
本次使用的案例是小幻代理
代码
导包
import loguru, requests, random, time # 发送请求,记录日志,等
from lxml import etree # 分析数据
from concurrent.futures import ThreadPoolExecutor # 线程池
网站页面的url
由于小幻代理的每个页面的url没有规律,所以需要一一获取
def get_url(): # 得到存放ip地址的网页
print("正在获取ip池", ",不要着急!")
for i in range(random.randint(10, 20)): # 爬取随机页数
time.sleep(1)
if i == 0:
url = "https://ip.ihuan.me/"
else:
url = url_list[-1]
try:
resp = requests.get(url=url, headers=headers_test, timeout=10)
except Exception as e:
print(e)
break
html = etree.HTML(resp.text)
ul = html.xpath('//ul[@class="pagination"]')
ul_num = html.xpath('//ul[@class="pagination"]/li')
for j in range(len(ul_num)):
if j != 0 and j != len(ul_num) - 1:
a = ul[0].xpath(f"./li[{
j}+1]/a/@href")[0]
url_list.append("https://ip.ihuan.me/" + a) # 得到许多的代理ip网址
loguru.logger.info(f"over,{
url}")
ip地址
def get_ip():
for i in url_list:
time.sleep(1)
resp = requests.get(url=i, headers=headers)
html = etree.HTML(resp.text)
td = html.xpath("//tbody/tr")
for i in td:
ip = i.xpath("./td[1]//text()")[0] # 地址
pt = i.xpath("./td[2]//text()")[0] # 端口
tp = "http" if i.xpath("./td[5]//text()")[0] == "不支持" else "https"