Python爬取快代理

前天,本人在爬取某网站时,第一次遇到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无忧】,了解更多,谢谢您的支持!
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章