前天,本人在爬取某网站时,第一次遇到IP被封的情况,等了几个小时之后,还是不行。最后,迫于无奈,还是请出了大招,使用代理IP。今天,闲来无事,本人爬取了快代理网站上 5 万多条免费高匿名代理IP。
首先,我们进入网站免费代理页面,可以看到该网站目前共有免费代理IP 3482 页。免费代理IP首页的url地址为:https://www.kuaidaili.com/free/inha/。
你可能会疑惑,我们的目标是爬取三千多页的代理IP信息,上面只提到了首页的url地址,如何知道其余页面的url地址呢?这时,不用着急,我们再点开第二页,可以看到第二页的url地址为https://www.kuaidaili.com/free/inha/2/,仔细观察就会发现,该url地址结尾有一个数字 2 ,你可能会想,第三页会不会就是3呢?事实上,正是如此,后面的以此类推……
这样,从第 2 页至最后一页的url地址所符合的规律我们已经找到了。其实,这种情况是很常见的,而且,首页url地址也可以是这样的,即url地址https://www.kuaidaili.com/free/inha/1/和https://www.kuaidaili.com/free/inha/对应的是同一页面。知道了这一点,我们就可以使用format()方法轻松写出每一页的url地址,代码如下:
url = 'https://www.kuaidaili.com/free/inha/{}/'.format(str(i))
好了,上面重要的问题已经分析完了,下面我们开始分析页面内容并尝试爬取所需信息。我们的目标是爬取每一页表格内的所有内容,下面以第一页内容为例分析。跟之前一样,我们先右键检查,可以看到如下页面:
通过观察发现,可以使用正则表达式re模块的findall()方法匹配相关信息,下面我们开始编写程序。
首先,我们需要导入所需的库,代码如下:
# 导入相关模块库
import requests
import re
import os
import time
下面我们尝试编写一个函数,用于匹配单个免费代理页面的所有信息。
def get_ipinfo(url):
'''定义一个函数,用于获取单个页面的IP代理信息'''
r = requests.get(url, headers={'user-agent':'Mozilla/5.0'}) # 获取网页内容
html = r.text # 获取http响应内容的字符串形式
# 利用正则表达式匹配IP、PORT、匿名度、类型、位置、响应速度、最后验证时间信息
ip = re.findall('<td data-title="IP">((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))</td>', html) # 匹配IP信息
port = re.findall('<td data-title="PORT">(\d+)</td>', html) # 匹配端口号信息
anonymity = re.findall('<td data-title="匿名度">([\u4e00-\u9fa5]+)</td>', html) # 匹配匿名度信息
genre = re.findall('<td data-title="类型">(.+)</td>', html) # 匹配类型信息
position = re.findall('<td data-title="位置">([\u4e00-\u9fa5 ]+)</td>', html) # 匹配位置信息
speed = re.findall('<td data-title="响应速度">(.+)</td>', html) # 匹配响应速度信息
time = re.findall('<td data-title="最后验证时间">(.+)</td>', html) # 匹配验证时间信息
ipinfo = zip(ip, port, anonymity, genre, position, speed, time) # 将本页面匹配信息压缩,写入csv文件
return ipinfo
匹配到信息之后,就需要将该页信息写入到一个csv文件中,下面我们将通过编写一个函数实现该功能,代码如下:
def write_ipinfo(ipinfo, page):
'''定义一个函数,将IP代理信息写入到指定的csv文件中'''
path = 'C:\\Users\\Lenovo\\Desktop\\IP代理' # 待写入文件存储目录
if not os.path.exists(path): # 判断桌面是否有名称为“IP代理”的文件夹,如果没有,就创建它
os.mkdir(path)
# 将匹配信息写入csv文件
with open(path + '//代理IP.csv', 'a' ,newline='') as f:
writer = csv.writer(f)
if page == 1:
writer.writerow(['IP', 'PORT', '匿名度', '类型', '位置', '响应速度', '最后验证时间']) # 写入表头信息
writer.writerows(ipinfo) # 写入单个页面匹配信息
通过上述两个函数,我们已经能够实现对某个页面信息的爬取和保存,下面只需要遍历每一页的url地址就可以爬取所有页面的免费代理IP信息,代码如下:
if __name__ == '__main__':
for page in range(3482):
url = 'https://www.kuaidaili.com/free/inha/{}/'.format(str(page+1))
ipinfo = get_ipinfo(url)
write_ipinfo(ipinfo, page+1)
time.sleep(1)
好了,利用上述程序,我们已经实现了免费代理IP的爬取工作,共计爬取代理IP信息 5万多条,下面是爬取的部分内容:
好了,以上就是本期内容,谢谢您的阅读!
觉得不错?扫描下方二维码,关注本人公众号【Python无忧】,了解更多,谢谢您的支持!