首先需要导入模块
至于为什么要用BeautifulSoup 而不用xpath
就是因为它上手简单,哈哈哈!
好吧!其实xpath也简单!!!
import requests,threading#请求模块和多线程模块
from bs4 import BeautifulSoup#获取网页数据模块
import time#时间模块
导入模块之后,然后需要给脚本上一下粉底,打扮成一个漂亮小仙女
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
}
哈哈哈!!!
如何获得粉底:
哈哈哈!!!
接下来是写逻辑代码
直接上代码
#encoding='utf-8'
#导入需要模块--
import requests,threading#请求模块和多线程模块
from bs4 import BeautifulSoup#获取网页数据模块
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
}
#免费代理ip
#获取网页ip获取
def geturl(pagenum,url):#网页的页数,网页的url
#获取网页URL
urls=url+str(pagenum)+".html"
#以text文本形式返回,至于为什么要用text返回,你可以自己打印去看看不用返回的是什么东西
req=requests.get(urls,headers=headers).text
#接下来用到BeautifulSoup模块解析网页
soup=BeautifulSoup(req,'lxml')
#获取网页里对我们有价值的东西
tr=soup.find('div',id='main').find_all('tr')#div下id=‘main’下的全部tr标签
#对tr标签进行for循环取出tr标签下的td标签里的宝贝
for j in tr[1:]:
td=j.find_all('td')
#精准获取td里的数据0和1为td的下标
ip=td[0].text
port=td[1].text
#获取到的东西丢给cleans方法验证这个代理ip是不是有效
is_avail=cleans(ip,port)
#如果返回True,则说明有效,并且打印出来
if is_avail==True:
print(ip+":"+port)
#对ip清洗
def cleans(ip,port):
proxy={"http":"http://%s"%(ip)+":%s"%(port),"https":"http://%s"%(ip)+":%s"%(port)}
try:
#verify https验证
#http://icanhazip.com/这个网站是一个返回ip的网站,自己去看看就知道了
req=requests.get(url="http://icanhazip.com/",headers=headers,proxies=proxy,timeout=2)#proxies是使用代理
#对网页返回的ip进行去空格
ips=req.text.strip()
#对使用的ip和网页返回的ip进行验证,相同就说明这个ip可用
if ips==ip:
return True
else:
return False
except:
return False
#开启多线程
def getip(url):
threads = []
for pagenum in range(10):#存放页数
t = threading.Thread(target=geturl, args=(pagenum + 1, url))#target放目标方法,就是对上面的网页开启多个线程,args这个放方法需要传的参数
threads.append(t)
print('开始爬取代理ip')
for s in threads: # 开启多线程爬取
#休眠0.3秒
time.sleep(0.3)
s.start()
for e in threads: # 等待所有线程结束
e.join()
print('爬取完成')
#程序入口
if __name__ == '__main__':
#放代理ip网页的URL
getip('http://www.66ip.cn/')
结束啦!!!