前言

有时候爬的次数太多时ip容易被禁,所以需要ip代理的帮助。
今天爬的思路是:到云代理获取大量ip代理,逐个检测,将超时不可用的代理排除,留下优质的ip代理。

一、爬虫分析

首先看看今天要爬取的网址

http://www.ip3366.net/free/

1.分析网址

首先判断网址是动态网址还是静态网址,静态网址就是直接能通过翻页从网址里找到页码,以下是每页的网址:

http://www.ip3366.net/free/?stype=1&page=2
http://www.ip3366.net/free/?stype=1&page=3
http://www.ip3366.net/free/?stype=1&page=4

所以推出是静态网址,每页page递增1的规律

2.分析数据

今天打算用xpath来解析数据,首先打开F12,可以看到每条代理的信息都包裹在tr中,因此我们可以先通过tr获取全部信息,再遍历tr里的ip,端口和类型

二、完整代码

附上完整代码和详细注释

import requests
from lxml import etree
# 5.检测ip质量
def check_ip(proxies_list):
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1'}
can_use=[]
for ip in proxies_list:
try:
# 设置超时时间timeout,如果响应时间超出则不合格
response=requests.get(url=base_url,headers=headers,proxies=ip,timeout=0.1)
if response.status_code==200:
can_use.append(ip)
except Exception:
print('当前代理ip:',ip,'请求超时,检测不合格')
finally:
print('当前代理ip:',ip,'检测通过')
return can_use proxies_list=[]
# 爬3页
for page in range(1,4):
print('---------------正在爬取第{}页数据---------------'.format(page))
# 1.分析url,添加headers,伪装成浏览器
base_url='http://www.ip3366.net/free/?stype=1&page={}'.format(str(page))
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1'}
# 2.发送请求
response=requests.get(url=base_url,headers=headers)
# 3.解析数据
response.encoding='gbk'
page_text=response.text
tree=etree.HTML(page_text)
# 获取所有ip代理的信息,就是所有tr
ip_list=tree.xpath('//*[@id="list"]/table/tbody/tr')
# 遍历ip代理
for tr in ip_list:
# xpath默认是列表类型,加个[0]就是文本类型了
http_type=tr.xpath('./td[4]/text()')[0]
ip=tr.xpath('./td[1]/text()')[0]
port=tr.xpath('./td[2]/text()')[0]
# 4.构建代理ip结构(格式像这样子{'HTTPS': '47.100.182.193:8081'})
proxies_dict={}
proxies_dict[http_type]=ip+":"+port
print('保存成功:',proxies_dict)
proxies_list.append(proxies_dict)
#放入空列表
print('获得代理ip数量:',len(proxies_list))
print('--------------------正在检测ip质量---------------')
can_use=check_ip(proxies_list)
print('质量高的:',can_use)
print('质量高的代理ip数量:',len(can_use))

运行效果如下:

总结

这个网站一次爬取次数多了,浏览器代理(headers)容易挂,换个浏览器代理即可。

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!

最新文章

  1. 给ListView设置emptyView
  2. 领域驱动有感<上>
  3. JS中的for/in语句和arguments参数
  4. EvreryDay Collect
  5. 问题解决——multimap中统计key的种类
  6. python 练习 7
  7. 分享:mysql 随机查询数据
  8. qt文本编辑器
  9. Android Studio使用教程图文详解
  10. Elixir游戏服设计四
  11. (2-3)Eureka详解
  12. Docker镜像的构成__docker commit
  13. java学习入门之---使用idea创建第一个maven项目
  14. C# 数组与集合的区别
  15. mysql常用压测工具
  16. vue-router-transiton
  17. Java - 异常解析基础
  18. mySQL 约束 (Constraints):一、非空约束 NOT NULL 约束
  19. 我的Oracle控制台创建数据库的工具
  20. mysql5.7.22的安装与配置(适用mysql5.7.20至mysql5.7.22版本)

热门文章

  1. 安装git和lsof
  2. 语音识别2 -- Listen,Attend,and Spell (LAS)
  3. windows创建隐藏用户的powershell脚本
  4. django基本内容
  5. python+selenium利用cookie记住密码
  6. mysql主从同步上---主从同步原理
  7. 17_Android网络通信
  8. linux下iptables原理
  9. 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划
  10. TextClip的list和search方法报错:UnicodeDecodeError: utf-8 codec canot decode byte 0xb7 in position 8