一篇文章让你拥有用不完的ip代理

本文包含代码所需的python外置库:

  • requests
  • BeautifulSoup4

本文尤为适合对python爬虫有必定了解的人群,可是若是你是小白,也能从文章中获取一些互联网的知识html

<font color=blue size=6>背景:</font>
随着大数据时代来临,数据对于咱们每一个人来讲都愈来愈重要,而互联网又是最重要、最普遍的数据获取来源。python

在这个时代下,咱们每一个人都应该掌握必定的从互联网获取信息的能力。而python爬虫,就是咱们从互联网获取信息的利器!服务器

当咱们运用python爬虫从互联网上获取信息时,常常的会遇到被封IP的尴尬状况。多线程

这是因为咱们的爬虫占据了网站太多的服务器资源而又对它几乎没有任何益处,因此人家固然不容许你这么作。
因此咱们须要使用代理来避免这种状况。python爬虫

<font color=blue size=6>正文:</font>函数

先讲思路,代码放在下面:
1.请求网页的内容
2.使用BeautufulSoup4分析网页内容,提炼出须要的内容
3.程序可自主选择爬取http仍是https的代理,高匿名仍是透明代理(推荐高匿名),爬取多少页
4.多线程对爬取下来的ip进行可用性检测(毕竟是免费的代理,不少都不能用的,须要本身进行检测)
5.写入文件(这部分能够改动)大数据

<font color=blue size=6>思路的代码分析:</font>网站

  • 请求网页内容使用requests库的get方法就能够,而且在在get函数中传入proxies参数,参数是一个字典,相似下面这样
经过 requests.get(url=url, headers=header,proxies={"http":"http://xx.xx.xx.xx"}, timeout=5) 使用http协议的ip代理
或者
经过 requests.get(url=url, headers=header,proxies={"https":"https://xx.xx.xx.xx"}, timeout=5)使用https协议的ip代理
  • 西拉代理官网的元素很好分析,使用bs4几行就分析好了

代理首页
咱们须要的是上面截图中三个箭头的元素,由于本程序提供http和https的选择功能,还有匿名度的选择功能。
若是有须要其它选择选项好比代理位置或者响应速度什么的,能够自行修改,或者能够联系我。url

  • 几个选项使用if判断语句判断一下分析出来的元素就可实现
  • ip可用性检测的方法是使用这个代理访问网站,如果访问成功则说明https代理有效,而http代理步骤稍多一步。http代理检测,是访问一个ip网站,这个网站会分析访问过来的ip并显示在页面上,咱们获取这个元素而后和咱们的代理进行比对来判断是否有效。多线程是因为如果ip不可用则至少花费5秒钟时间等待,这样显得效率十分低下,因此开多线程(鉴于GIL锁的存在,此处的多线程与python的协程差很少,有不懂的能够私信我)
  • 写入文件这一部分很简单,可是能够做改动,由于从网上爬取下来的ip可能随时会失效,因此使用文件保存是很差的,最好是随时爬取,有效就直接用。能够考虑改造一下函数变成一个列表生成器,每次yield一个列表出去,列表里面放置了有效的ip。

<font color=blue size=6>代码:</font>spa

import requests
from bs4 import BeautifulSoup
import time
import threading

IP_MODE = 1  # 1. http   2.https
NI_MING_MODE = 1  # 1.高匿   2.透明
PAGE = 50  # 默认爬取50页

url = ""
if IP_MODE == 1:
    url = "http://www.xiladaili.com/http/{}/"
elif IP_MODE == 2:
    url = "http://www.xiladaili.com/https/{}/"
else:
    # 输入其它数字默认为http
    url = "http://www.xiladaili.com/http/{}/"


header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"}


def test_http(host):
    """
    检测http代理IP是否有效并将有效IP写入文件
    """
    ip = {}
    ip["http"] = "http://" + host
    # 经过访问下面这个ip检测网站来判断
    url = "http://ip.tool.chinaz.com/"


    # http无效的状况大体有两种 1.没法访问这个网页,那么这个代理不可用 2.能访问网页可是没有达到代理效果,即仍然使用的本身的ip访问网页

    try:
        html = requests.get(url=url, headers=header,
                            proxies=ip, timeout=5).text
    except:
        return
    else:
        soup = BeautifulSoup(html, "lxml")

        try:
            real_ip = soup.select_one(".fz24").text
        except:
            return
        if real_ip == host.split(":")[0]:
            print("有效IP:" + host)
            with open("xila_http_list.txt", "a") as af:
                af.write(host + " ")
        else:
            return


def test_https(host):
    """
    检测https代理是否有效,并将有效IP写入文件
    """
    ip = {}
    ip["https"] = "https://" + host

    url = "https://blog.csdn.net/luoyangIT"

    # https检测只能经过检查是否能访问https协议的网页来判断,如有其它方法则继续增长

    try:
        html = requests.get(url=url, headers=header,
                            proxies=ip, timeout=5).text
    except:
        return
    else:
        print("有效IP:" + host)
        with open("xila_https_list.txt", "a") as af:
            af.write(host + " ")


def main():
    """
    主函数,入口
    """
    for i in range(1, PAGE):
        # 延时,避免对服务器形成太大负荷,同时在延时时间内检测代理可用状况
        time.sleep(3)
        # 请求页面text
        html = requests.get(url=url.format(i), headers=header).text
        soup = BeautifulSoup(html, "lxml")
        # 分析元素
        tr_list = soup.select_one(".fl-table").select_one("tbody").select("tr")
        # 获取元素
        for td_list in tr_list:
            # 高匿
            if NI_MING_MODE == 1 and "高匿" in td_list.select("td")[2].text:

                # http
                if IP_MODE == 1:
                    t = threading.Thread(target=test_http, args=(
                        td_list.select("td")[0].text,))
                    t.start()

                # https
                elif IP_MODE == 2 and test_https(td_list.select("td")[0].text):
                    t = threading.Thread(target=test_https, args=(
                        td_list.select("td")[0].text,))
                    t.start()

            # 透明
            elif NI_MING_MODE == 2 and "透明" in td_list.select("td")[2].text:

                # http
                if IP_MODE == 1:
                    t = threading.Thread(target=test_http, args=(
                        td_list.select("td")[0].text,))
                    t.start()

                # https
                elif IP_MODE == 2:

                    t = threading.Thread(target=test_https, args=(
                        td_list.select("td")[0].text,))
                    t.start()


if __name__ == "__main__":
    main()

代码中我已附上大量注释,但愿你们都能看懂,不懂得能够私信我交流

个人我的公众号是【程序小员】,欢迎你的关注!

我是落阳,谢谢你的到访!

相关文章
相关标签/搜索