【Python爬虫】代理池的使用

181 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

代理的使用


我们在做爬虫的过程中经常会遇到这样的情况:最初爬虫正常运行,正常之前数据,一切看起来都很好。但是有时候会报403 Forbidden;这时候网页上可能会出现“您的IP访问频率太高”这样的提示。出现这个现象的原因是网站采取了反扒措施,服务器会检测某个IP在单位时间内的请求次数,如果超过就会拒绝服务,这时候就需要用代理。

代理池简单实例

爬取ip
验证ip可用性
保存可以用的ip

这个只是网络上简单的代理池应用,正规的代理池维护还需要数据库等其他内容,暂时无法找到这方面完整内容。

  • 代理池工作流程文字描述

    • 代理IP采集模块 ->采集代理IP -> 检测代理IP -> 如果不可用,直接过滤掉,如果可用,指定默认分数 -> 存入数据库中
    • 代理IP检测模块 -> 从数据库中获取所有代理IP -> 检测代理IP -> 如果代理IP不可用,就把分数-1,如果分数为0则会将其从数据库中删除,如果代理ip可用,恢复默认分数值,更新到数据库
    • 代理API模块 -> 从数据库中提取高可用的代理IP给爬虫使用
 import requests
 from fake_useragent import UserAgent
 from lxml import etree
 import json
 ​
 # 在西刺网站上爬取ip,不要用自己的ip爬取太多次,会被封
 # xpath爬取的内容是列表,要转化为字典
 def get_ip(url):
     response = requests.get(url, headers={'User-Agent': UserAgent().chrome}).text
     e = etree.HTML(response)
     type_ip = e.xpath('//tr/td[6]/text()')
     ip = e.xpath('//tr/td[2]/text()')
     port = e.xpath('//tr/td[3]/text()')
     ip_list = []
     for i in range(len(type_ip)):
         ip_dict = {}
         ip_dict[type_ip[i]] = ip[i] + ':' + port[i]
         ip_list.append(ip_dict)
     return ip_list
 ​
 # 用百度网站验证ip是否可用
 def test_ip(ip_list):
     good_ip = []
     i = 1
     for ip in ip_list:
         print('开始测试第{}个ip'.format(i))
         test_url = 'https://www.baidu.com'
         response = requests.get(test_url, headers={'User-Agent': UserAgent().chrome}, proxies=ip, timeout=0.5)
         if response.status_code == 200:
             del ip['no']
             good_ip.append(ip)
         else:
             print('该ip不可用')
         i += 1
     return good_ip
 ​
 # 保存ip
 def save_ip(good_ip):
     with open('ip.txt', 'a') as f:
         for ip in good_ip:
             f.write(json.dumps(ip) + '\n')
 ​
 # 主函数,爬取了2页
 def main():
     for i in range(1, 3):
         url = 'https://www.xicidaili.com/nn/{}'.format(i)
         ip_list = get_ip(url)
         good_ip = test_ip(ip_list)
         save_ip(good_ip)
 ​
 if __name__ == '__main__':
     main()