深度優(yōu)先策略:優(yōu)先往縱向挖掘深入,直到到達指定的深度或者該節(jié)點不存在鄰接節(jié)點,才會訪問第二條路诉濒。
廣度優(yōu)先策略:先訪問完一個深度的所有節(jié)點钞诡,再訪問更深一層的所有節(jié)點郑现。
簡單的看:
深度優(yōu)先爬蟲路徑:A-B-E-F-C-D
廣度優(yōu)先爬蟲路徑:A-B-C-D-E-F
import requests
import re
import time
exist_urls=[]
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36',
}
#定義一個用來獲取頁面所有符合條件的鏈接函數(shù)
def scrapypy(url):
try:
response=requests.get(url=url,headers=headers)
response.encoding='UTF-8'
html=response.text
link_lists=re.findall('.*?<a target=_blank href="/item/([^:#=<>]*?)".*?</a>',html)
return link_lists
except Exception as e:
print(e)
print('下載失敗:'+url)
return None
finally:
exist_urls.append(url)
#主函數(shù)用來定義輸出格式,當爬取深度小于三層時荧降,遞歸調用主函數(shù)接箫,繼續(xù)爬取第二層的所有鏈接
def main(start_url,depth=1):
count=0
link_lists=scrapypy(start_url)
if link_lists:
unique_lists=list(set(link_lists)-set(exist_urls))
for unique_list in unique_lists:
unique_list='https://baike.baidu.com/item/'+unique_list
count=count+1
output='No.'+str(count)+'\t Depth:'+str(depth)+'\t'+start_url+'======>'+unique_list+'\n'
print(output)
with open('title.txt','a+') as f:
f.write(output)
f.close()
if depth<2:
main(unique_list,depth+1)
if __name__=='__main__':
t1=time.time()
start_url='https://baike.baidu.com/item/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91'
main(start_url)
t2=time.time()
print('總時間',t2-t1)
爬取深度為2時的運行結果:
另外還嘗試了深度為3的爬蟲,爬了六萬個就提示寫不進去朵诫,暫且暫停了辛友。后面繼續(xù)學習廣度優(yōu)先的爬蟲。