根据网上的一些教程,尝试爬取代理IP,并提供验证
本文仅供个人练习使用,不定期添加解释(python 3.8)
一、 工具准备
爬取代理IP,首先需要准备:
- python
- requests 库
- fake_useragent 库(可选)
- lxml 库
- 代理 ip 网页
- 验证 ip 网页
本次采用python 3.8版本;requests库 2.22 版本,requests 库是网页爬虫的常用库;fake_useragent 库 0.1 版本,用于设置浏览器;lxml 库 4.5 版本,用于解析页面。
代理 ip 网页:西祠代理,也可以用其他的页面,度娘一大堆。
验证 ip 网页:验证ip,会返回一个带有ip信息的页面。
二、必要包导入
首先导入几个必要的包:
import requests
import time
import json
from fake_useragent import UserAgent
from lxml.html import etree
time 包用于设置爬取延迟(减轻对方服务器压力),json 包用于读写json格式数据,etree 模块用于xpath解析路径
注意: lxml 4.5 以前的版本,导入etree模块可能的方式为
from lxml import etree
三、页面爬取和解析
1.页面爬取
把页面的爬取封装到get_page()
方法里,用requests库最常用的get方法获取页面html代码,实例化UserAgent()
,随机生成一个chrome浏览器
UA=UserAgent()
H = {
'user-agent': UA.chrome
}
re = requests.get(url = url,headers = H)
url的设置需要注意,为了能够爬取到多页数据,经过观察不难发现,url的换页有规律,即最后的数字
url = f'https://www.xicidaili.com/nn/{pg}'
pg是get_page()
方法的一个形参,传入页数
2.页面解析
同样封装在parse_page()
方法中,etree模块解析页面,xpath方法获取目标ip和端口。这里需要注意的是xpath路径中,标签的索引是从 1 而不是0开始的。
ip = Html.xpath('//tr/td[2]/text()')
duan = Html.xpath('//tr/td[3]/text()')
结果会返回一个列表,ip和端口组合后,返回
三、代理验证和数据更新
1.代理验证
封装在check_ip()
方法中,用requests库get方法,循环验证ip。timeout是设置请求的最大次数,加快验证速度,如果仍请求失败就返回一个错误,利用 try/except 捕获。
proxie = {
'http' : 'http://' + ip,
'https': 'https://' + ip
}
re = requests.get(url = url, headers = headers, proxies = proxie, timeout = 3)
注意:这里的 ip 是和端口组合后的字符串,url是验证的网址
2.数据更新
验证成功的数据,依次写入json文件当中,以便日后使用提取
with open('xici_IP_pool.json'