批量抓取西刺ip并保存到本地

西刺是一个免费提供IP代理的网站,因为所提供的IP数量庞大且免费,可以为有需要的人提供很大的帮助,所以受到了想要获取免费IP人的热捧,这里是它的网站地址 点这里。 话不多说,现在开干

  1. 首先观察网页,进入网站,进入开发者模式,选取要爬取的字段,这里确定自己要爬取的是IP的地址、端口、类型批量抓取西刺ip并保存到本地
    可以看到,我们要爬取的字段在一个tr标签下面的td标签中,直接右键点击,复制css selector地址。由于自己抓取的ip是为了抓取别的网站,需要用HTTPS类型的IP,所以将类型一起抓下来,后面区分。
    2 这里使用BeautifulSoup+Requests抓取,其实使用正则表达式可以直接抓取一整页的数据,这里给出正则表达式
    `re_dizhi = re.compile( r’\b(??????:25[0-5]|2[0-4]\d|[01]?\d{1,2}).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b’, re.S)

    re_duankou = re.compile(
        '<td>(\d{2,5})</td>', re.S
    )
    dizhi = re.findall(re_dizhi, response)
    duankou = re.findall(re_duankou, response)`
    

以下是自己代码:

import requests
import telnetlib   # 实现ip的检测
from bs4 import BeautifulSoup


def get_html(page_number):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.\
        0.3578.98 Safari/537.36"
    }
    base_url = "https://www.xicidaili.com/nn/"
    for i in range(1, page_number+1):
        url = base_url + str(i)  # 结合URL
        response = requests.get(url, headers=headers).text
        soup = BeautifulSoup(response, 'lxml')
        types = [i.get_text() for i in soup.select("tr > td:nth-of-type(6)")]
        ip_address = [i.get_text() for i in soup.select('tr > td:nth-of-type(2)')]
        ip_ports = [i.get_text() for i in soup.select("tr > td:nth-of-type(3)")]
        for type, ip_addres, ip_port in zip(types, ip_address, ip_ports):   # 使用zip函数实现抓取字段一一对应
            data = {
                'type': type,
                'ip_address': ip_addres,
                'ip_port': ip_port
            } 
            if data['type'] == "HTTPS":    # 设置一个简单的过滤
            # 才发现西刺可以直接选HTTPS的选项,是我大意了,一定得要好好观察页面才行
                verify_ip(data['ip_address'], data['ip_port'])
            else:
                pass


def verify_ip(ip_agent, ip_port):
    try:
        telnetlib.Telnet(ip_agent, ip_port, timeout=1)  # 利用Telnet函数实现ip检测
    except:
        pass
    else:
        ip = "HTTPS://" + ip_agent + ":" + ip_port
        with open('ip.txt', 'a') as f:  # 会在项目文件目录下生成一个ip.txt文件
            print("正在存储IP:" + ip)   # 保存数据
            f.write(ip+'\n')


if __name__ == '__main__':
    page_number = int(input("输入你想要抓取的ip页数:", ))
    get_html(page_number)

具体的代码需要自己消化,其实有时候用Xpath来做更为简单,但是需要用导入Scrapy.selector的Selector方法,因为BeautifulSoup只支持css select。
如果不需要HTTPS过滤的,可以自行删除过滤或者直接使用正则表达式更为简单暴力,但是作为初学者还是使用最基本的BeautifulSoup+requests库来实现,可以巩固一下知识。
以下是运行中:
批量抓取西刺ip并保存到本地
以下是抓取到的IP:
批量抓取西刺ip并保存到本地
纸上得来终觉浅,绝知此事要躬行