当前位置: 首页 > 后端技术 > Python

一篇文章让你拥有无穷无尽的ip代理

时间:2023-03-26 16:52:19 Python

本文包含代码所需的python外部库:requestsBeautifulSoup4从背景获取一些互联网知识:随着大数据时代,数据对我们每个人来说越来越重要,而互联网是最重要、最广泛的数据获取来源。在这个时代,我们每个人都应该具备一定的从网络上获取信息的能力。而python爬虫是我们获取网络信息的利器!我们在使用python爬虫从网上获取信息的时候,经常会遇到被IP封禁的尴尬情况。这是因为我们的爬虫占用了网站太多的服务器资源,对网站没有任何好处,所以当然不能这样做。所以我们需要使用代理来避免这种情况。正文:先说说思路,下面放代码:1.请求网页内容2.使用BeautifulSoup4分析网页内容,提取所需内容3.程序可以选择自主爬取选择http或者https代理,高匿名还是透明代理(推荐高匿名),爬取多少页面4.多线程检查爬取的IP是否可用(毕竟,是免费代理,很多不能用,需要自己检查)5.写入文件(这部分可以改)代码思路分析:使用requests库的get方法请求网页内容,在get函数中传入proxies参数,它是一个字典,像下面这样通过requests.get(url=url,headers=header,proxies={"http":"http://xx.xx.xx.xx"},timeout=5)使用http协议的ip代理或者通过requests.get使用https(url=url,headers=header,proxies={"https":"https://xx.xx.xx.xx"},timeout=5)协议ip代理官网的元素很容易分析。我们可以用几行bs4来分析一下。我们需要的是上面截图中三个箭头的元素,因为这个程序提供了http和https的选择功能,以及匿名程度的选择功能。如果您需要代理位置或响应速度等其他选择选项,您可以自行修改,也可以联系我。几个选项使用if判断语句判断被分析的元素,实现ip可用性检测。方法是使用这个代理访问网站。如果访问成功,说明https代理有效,http代理步骤稍微多一点。HTTP代理检测就是访问一个ip网站。本网站会对访问的ip进行解析,并显示在页面上。我们得到这个元素并将它与我们的代理进行比较以确定它是否有效。多线程是因为如果ip不可用,至少要等待5秒,效率很低,所以开启多线程(鉴于GIL锁的存在,这里的多线程类似python协程,有不懂的可以私信我)写文件的部分很简单,但是可以改,因为从网上爬的ip随时可能失效,所以不好用文件保存,最好随时爬取,有效直接使用。可以考虑把函数改成列表生成器,每次生成一个列表,并在列表中放置一个有效的ip。代码:importrequestsfrombs4importBeautifulSoupimporttimeimportthreadingIP_MODE=1#1.http2.httpsNI_MING_MODE=1#1.高隐藏2.透明PAGE=50#默认抓取50页url=""ifIP_MODE==1:url="http://www.xiladaili.com/http/{}/"elifIP_MODE==2:url="http://www.xiladaili.com/https/{}/"else:#输入其他数字,默认为httpurl="http://www.xiladaili.com/http/{}/"header={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.3945.117Safari/537.36"}deftest_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).textexcept:returnelse:soup=BeautifulSoup(html,"lxml")try:real_ip=soup.select_one(".fz24").text除了:returnifreal_ip==host.split(":")[0]:print("ValidIP:"+host)withopen("xila_http_list.txt","a")asaf:af.write(host+"")else:returndeftest_https(host):"""检测https代理是否有效,写入有效IPFile"""ip={}ip["https"]="https://"+hosturl="https://blog.csdn.net/luoyangIT"#https检测只有能访问才能检查https协议如果还有其他方法,继续添加try:html=requests.get(url=url,headers=header,proxies=ip,timeout=5).textexcept:returnelse:print("ValidIP:"+host)withopen("xila_https_list.txt","a")asaf:af.write(host+"")defmain():"""Mainfunction,entry"""foriinrange(1,PAGE):#延迟,避免服务器负载过大,同时在延迟时间内检测代理的可用性time.sleep(3)#请求页面文本html=requests.get(url=url.形式at(i),headers=header).textsoup=BeautifulSoup(html,"lxml")#分析元素tr_list=soup.select_one(".fl-table").select_one("tbody").select("tr")#获取元素fortd_listintr_list:#高朋ifNI_MING_MODE==1and"高朋"intd_list.select("td")[2].text:#httpifIP_MODE==1:t=threading.Thread(target=test_http,args=(td_list.select("td")[0].text,))t.start()#httpselifIP_MODE==2andtest_https(td_list.select("td")[0].text):t=threading.Thread(target=test_https,args=(td_list.select("td")[0].text,))t.start()#透明elifNI_MING_MODE==2and"透明"intd_list.select("td")[2].text:#httpifIP_MODE==1:t=threading.Thread(target=test_http,args=(td_list.select("td")[0].text,))t.start()#httpselifIP_MODE==2:t=threading.Thread(target=test_https,args=(td_list.select("td")[0].text,))t.start()if__name__=="__main__":我在main()代码里附了很多注释,希望大家看得懂,如果看不懂懂的可以私信我交流我的个人公众号是【程序员】,欢迎大家关注!我是洛阳,感谢您的光临!