御劍自帶了字典,主要是分析字典中的網址是否存在,但是可能會漏掉一些關鍵的網址,于是前幾天用python寫了一個爬取網站全部鏈接的爬蟲。
實現方法
python獲取當前url?主要的實現方法是循環,具體步驟看下圖:
貼上代碼:
# author: saucer_man
用python寫網絡爬蟲、# date:2018-04-24
# python3.6
import re
python爬蟲教程?import requests
# 獲取并檢驗要爬取的網站
def url_get():
python gui,url=input("please input the url:")
try:
kv={'user_agent':'Mozilla/5.0'}
python編程。requests.get(url,headers=kv)
return url
except:
print("your url is incorrect!!")
return url_get()
'''
找出url中的域名
比如從https://www.xiaogeng.top/article/page/id=3篩選出www.xiaogeng.top
'''
def url_same(url):
#判斷輸入的網站使用的是https還是http
urlprotocol=re.findall(r'.*(?=://)',url)[0]
print('該站使用的協議是:' + urlprotocol)
if len(re.findall(r'/',url)) >2:
if urlprotocol=='https':
sameurl = re.findall(r'(?<=https://).*?(?=/)', url)[0]
else:
sameurl = re.findall(r'(?<=http://).*?(?=/)', url)[0]
else:
url = url + '/'
if urlprotocol=='https':
sameurl = re.findall(r'(?<=https://).*?(?=/)',url)[0]
else:
sameurl = re.findall(r'(?<=http://).*?(?=/)',url)[0]
print('域名地址:' + sameurl)
return sameurl
# 爬取url頁面中的所有鏈接
def spiderpage(url):
kv={'user_agent':'Mozilla/5.0'}
r=requests.get(url,headers=kv)
r.encoding=r.apparent_encoding
pagetext=r.text
pagelinks = re.findall(r'(?<=href=").*?(?=")|(?<=href=').*?(?=')',pagetext)
return pagelinks
#篩選pagelinks中的url
def url_filtrate(pagelinks):
'''
print("我現在在篩選")
'''
#去除不是該站點的url
same_target_url = []
for l in pagelinks:
if re.findall(sameurl,l):
same_target_url.append(l)
#去除重復url
unrepect_url = []
for l in same_target_url:
if l not in unrepect_url:
unrepect_url.append(l)
return unrepect_url
#將一個列表寫入文件
def writetofile(list):
file=open('urls.txt','w')
for url in list:
file.write(url)
file.write('n')
file.close()
# url集合,循環遍歷會用到
class linkQuence:
def __init__(self):
#已訪問的url集合
self.visited=[]
#待訪問的url集合
self.unvisited=[]
#獲取訪問過的url隊列
def getvisitedurl(self):
return self.visited
#獲取未訪問的url隊列
def getunvisitedurl(self):
return self.unvisited
#添加url到訪問過得隊列中
def addvisitedurl(self,url):
return self.visited.append(url)
#移除訪問過得url
def removevisitedurl(self,url):
return self.visited.remove(url)
#從未訪問隊列中取一個url
def unvisitedurldequence(self):
try:
return self.unvisited.pop()
except:
return None
#添加url到未訪問的隊列中
def addunvisitedurl(self,url):
if url!="" and url not in self.visited and url not in self.unvisited:
return self.unvisited.insert(0,url)
#獲得已訪問的url數目
def getvisitedurlount(self):
return len(self.visited)
#獲得未訪問的url數目
def getunvistedurlcount(self):
return len(self.unvisited)
#判斷未訪問的url隊列是否為空
def unvisitedurlsempty(self):
return len(self.unvisited)==0
# 真正的爬取函數
class Spider():
def __init__(self,url):
self.linkQuence = linkQuence() #引入linkQuence類
self.linkQuence.addunvisitedurl(url) #并將需要爬取的url添加進linkQuence對列中
def crawler(self):
while not self.linkQuence.unvisitedurlsempty():# 若未訪問隊列非空
print("嘀嘀嘀我又爬到一個")
visitedurl = self.linkQuence.unvisitedurldequence()# 取一個url
if visitedurl is None or visitedurl == '':
continue
initial_links=spiderpage(visitedurl) # 爬出該url頁面中所有的鏈接
right_links = url_filtrate(initial_links) # 篩選出合格的鏈接
self.linkQuence.addvisitedurl(visitedurl) # 將該url放到訪問過的url隊列中
for link in right_links: # 將篩選出的鏈接放到未訪問隊列中
self.linkQuence.addunvisitedurl(link)
# print(self.linkQuence.visited)
print("哥我爬完了")
return self.linkQuence.visited
if __name__ == '__main__':
url=url_get()
sameurl=url_same(url)
spider=Spider(url)
urllist=spider.crawler()
writetofile(urllist)
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态