本文尤其适合对python爬虫有一定了解的人群,但是如果你是小白,也能从文章中获取一些互联网的知识
<font color=blue size=6>背景:</font>
随着大数据时代来临,数据对于我们每个人来说都越来越重要,而互联网又是最重要、最广泛的数据获取来源。
在这个时代下,我们每个人都应该掌握一定的从互联网获取信息的能力。而python爬虫,就是我们从互联网获取信息的利器!
当我们运用python爬虫从互联网上获取信息时,经常的会遇到被封IP的尴尬情况。
这是由于我们的爬虫占据了网站太多的服务器资源而又对它几乎没有任何益处,所以人家当然不允许你这么做。
所以我们需要使用代理来避免这种情况。
<font color=blue size=6>正文:</font>
先讲思路,代码放在下面:
1.请求网页的内容
2.使用BeautufulSoup4分析网页内容,提炼出需要的内容
3.程序可自主选择爬取http还是https的代理,高匿名还是透明代理(推荐高匿名),爬取多少页
4.多线程对爬取下来的ip进行可用性检测(毕竟是免费的代理,很多都不能用的,需要自己进行检测)
5.写入文件(这部分可以改动)
<font color=blue size=6>思路的代码分析:</font>
通过 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代理
我们需要的是上面截图中三个箭头的元素,因为本程序提供http和https的选择功能,还有匿名度的选择功能。
如果有需要其它选择选项比如代理位置或者响应速度什么的,可以自行修改,或者可以联系我。
<font color=blue size=6>代码:</font>
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()
代码中我已附上大量注释,希望大家都能看懂,不懂得可以私信我交流
我的个人公众号是【程序小员】,欢迎你的关注!
我是落阳,谢谢你的到访!