Python3爬蟲之爬取某一路徑的所有html文件


要離線下載易百教程網站中的所有關於Python的教程,需要將Python教程的首頁作為種子url:http://www.yiibai.com/python/,然后按照廣度優先(廣度優先,使用隊列;深度優先,使用棧),依次爬取每一篇關於Python的文章。為了防止同一個鏈接重復爬取,使用集合來限制同一個鏈接只處理一次。
使用正則表達式提取網頁源碼里邊的文章標題和文章url,獲取到了文章的url,使用Python根據url生成html文件十分容易。



   
   
  
  
          
  1. import re
  2. import urllib.request
  3. import urllib
  4. from collections import deque
  5. # 保存文件的后綴
  6. SUFFIX= '.html'
  7. # 提取文章標題的正則表達式
  8. REX_TITLE= r'<title>(.*?)</title>'
  9. # 提取所需鏈接的正則表達式
  10. REX_URL= r'/python/(.+?).html'
  11. # 種子url,從這個url開始爬取
  12. BASE_URL= 'http://www.yiibai.com/python/'
  13. # 將獲取到的文本保存為html文件
  14. def saveHtml(file_name,file_content):
  15. #    注意windows文件命名的禁用符,比如 /
  16.     with open (file_name.replace( '/', '_')+SUFFIX, "wb") as f:
  17. #   寫文件用bytes而不是str,所以要轉碼
  18.         f.write(bytes(file_content, encoding = "utf8"))
  19. #   獲取文章標題
  20. def getTitle(file_content):
  21.     linkre = re.search(REX_TITLE,file_content)
  22.     if(linkre):
  23.         print( '獲取文章標題:'+linkre.group( 1))
  24.         return linkre.group( 1)
  25.  
  26. #   爬蟲用到的兩個數據結構,隊列和集合
  27. queue = deque()
  28. visited = set()
  29. #   初始化種子鏈接 
  30. queue.append(BASE_URL)
  31. count = 0
  32.  
  33. while queue:
  34.   url = queue.popleft()   # 隊首元素出隊
  35.   visited |= {url}   # 標記為已訪問
  36.  
  37.   print( '已經抓取: ' + str(count) + '   正在抓取 <---  ' + url)
  38.   count += 1
  39.   urlop = urllib.request.urlopen(url)
  40.   # 只處理html鏈接
  41.   if 'html' not in urlop.getheader( 'Content-Type'):
  42.     continue
  43.  
  44.   # 避免程序異常中止
  45.   try:
  46.     data = urlop.read().decode( 'utf-8')
  47.     title=getTitle(data);
  48.     # 保存文件
  49.     saveHtml(title,data)
  50.   except:
  51.     continue
  52.  
  53.   # 正則表達式提取頁面中所有鏈接, 並判斷是否已經訪問過, 然后加入待爬隊列
  54.   linkre = re.compile(REX_URL)
  55.   for sub_link in linkre.findall(data):
  56.       sub_url=BASE_URL+sub_link+SUFFIX;
  57. # 已經訪問過,不再處理
  58.       if sub_url in visited:
  59.           pass
  60.       else:
  61.           # 設置已訪問
  62.           visited |= {sub_url}
  63.           # 加入隊列
  64.           queue.append(sub_url)
  65.           print( '加入隊列 --->  ' + sub_url)




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM