1. 程式人生 > >python編寫爬蟲獲取區域程式碼-遞迴獲取所有子頁面

python編寫爬蟲獲取區域程式碼-遞迴獲取所有子頁面

上一篇文章用htmlparser寫了一個java的獲取區域的爬蟲,覺得太笨重。發現python也可以實現這個功能。

這裡就簡單寫一個用python3寫的小爬蟲例子

功能目標:對指定網站的所有區域資訊進行篩選,並儲存到文字中

思路:1、定義一個佇列,初始向佇列中put一個地址

   2、判斷佇列是否為空,不為空呼叫getURL函式,為空則結束

   3、getURL獲取URL連結的內容,並用beautifulSoup(第三方需要單獨安裝,可百度)匹配a連結

   4、對匹配的內容進行字串拼接,呼叫text_create儲存成文字

宣告:這個只是一個DEMO,可以參考學習使用,所以邏輯不是很嚴謹,大家勿噴。

#coding:utf-8
import urllib.request
import sys,operator
import queue
import re
import sys
from bs4 import BeautifulSoup
base = "http://www.diqudaima.com/"
lr = queue.Queue()

def text_create(name, msg):#儲存檔案,傳入檔名與內容
    desktop_path = '/Users/wuhao/Desktop/python/'    
    full_path = desktop_path + name + '.txt' 
    file = open(full_path,'w')             
    file.write(msg) 
    file.close() 
    print('Done :',name)

def getURL(url):
	try:
		req = urllib.request.Request(url)
		response = urllib.request.urlopen(req)
		the_page = response.read().decode("GBK")
		soup = BeautifulSoup(the_page, 'html.parser')
		data=soup.select("div ul li a")#獲取a連結
		body =''
		if len(data)>0:
			for html_tag in data:
				print("title :  "+html_tag.string)
				print(base+html_tag['href'][1:])
				body+=html_tag.string
				body+='\n'
				lr.put_nowait(base+html_tag['href'][1:])
		else:
			data=soup.select("div ul li")
			for html_tag in data:
				print("title :  "+html_tag.string)
				body+=html_tag.string
				body+='\n'
		mode = re.compile(r'\d+')
		print (mode.findall(url))
		if len(mode.findall(url))>0:
			text_create(mode.findall(url)[0],body)
	except:#因為可能出現TimeoutError等異常,這裡捕獲並重新放入佇列中
		print("連結超時,未處理連結:",lr.qsize())
		lr.put_nowait(url)
	else:
		print("未處理連結:",lr.qsize())

if __name__ == "__main__":
	url="http://www.diqudaima.com/zhejiang/hangzhoushi/"
	lr.put_nowait(url)
	while not lr.empty():
		vistorUrl =lr.get_nowait()
		print ("訪問連結:"+vistorUrl)
		getURL(vistorUrl)
		

執行結果: