本文尤为适合对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(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的选择功能,还有匿名度的选择功能。
若是有须要其它选择选项好比代理位置或者响应速度什么的,能够自行修改,或者能够联系我。url
<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()
代码中我已附上大量注释,但愿你们都能看懂,不懂得能够私信我交流
个人我的公众号是【程序小员】,欢迎你的关注!
我是落阳,谢谢你的到访!