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

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

  • requests
  • BeautifulSoup4

本文尤其适合对python爬虫有一定了解的人群,但是如果你是小白,也能从文章中获取一些互联网的知识

背景

随着大数据时代来临,数据对于我们每个人来说都越来越重要,而互联网又是最重要、最广泛的数据获取来源。

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

当我们运用python爬虫从互联网上获取信息时,经常的会遇到被封IP的尴尬情况。

这是由于我们的爬虫占据了网站太多的服务器资源而又对它几乎没有任何益处,所以人家当然不允许你这么做。
所以我们需要使用代理来避免这种情况。

正文

网上有一些专门提供代理IP的网站,这里展现了两个,如果需要更多可以自行搜索查找。

1.西刺免费代理
免费IP非常多,这个网站也在很早就有了,但是有一个缺点,我爬取这个网站上的代理的时候爬不了几页就被封了!即使我每爬一页都设置了3秒钟的间隔。难道我还要用代理来爬取代理?于是我又找其他的代理网站。

2.西拉ip代理官网
本篇文章是使用这个网站爬取的IP,网站界面很好看,IP也很多,并且还提供了API每天五百个免费的量,重要的是封IP没那么严,爬取的时候可以放心爬(但是最好不要对它的服务器造成太大负荷,我是每一页间隔两秒钟)

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

思路代码分析

  • 请求网页内容使用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的选择功能,还有匿名度的选择功能。
如果有需要其它选择选项比如代理位置或者响应速度什么的,可以自行修改,或者可以联系我。

  • 几个选项使用if判断语句判断一下分析出来的元素就可实现

  • ip可用性检测的方法是使用这个代理访问网站,若是访问成功则说明https代理有效,而http代理步骤稍多一步。http代理检测,是访问一个ip网站,这个网站会分析访问过来的ip并显示在页面上,我们获取这个元素然后和我们的代理进行比对来判断是否有效。多线程是由于若是ip不可用则至少花费5秒钟时间等待,这样显得效率十分低下,所以开多线程(鉴于GIL锁的存在,此处的多线程与python的协程差不多,有不懂的可以私信我)

  • 写入文件这一部分很简单,但是可以作改动,因为从网上爬取下来的ip可能随时会失效,所以使用文件保存是不好的,最好是随时爬取,有效就直接用。可以考虑改造一下函数变成一个列表生成器,每次yield一个列表出去,列表里面放置了有效的ip。

代码

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()

代码中我已附上大量注释,希望大家都能看懂,不懂得可以私信我交流。

我是落阳,谢谢你的到访!希望大家都平平安安健健康康!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,533评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,055评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,365评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,561评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,346评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,889评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,978评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,118评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,637评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,558评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,739评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,246评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,980评论 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,362评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,619评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,347评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,702评论 2 370