本文以爬取國家地理中文網中的旅行類中的圖片為例,示範爬蟲具備的準系統。 給定初始地址
國家地理中文網 : http://www.ngchina.com.cn/travel/ 擷取並分析網頁內容
a、分析網頁結構,確定想要的內容部分
我們開啟網頁,右擊選擇《顯示網頁原始碼》查看網頁結構,下面是我截取的部分
我們會發現,圖片類型的資料都放在< img >標籤 的scr=”“內,我們只要找出這些標籤,從中提取我們想要的串連即可完成我們的預期。
b、擷取網頁內容
想要提取內容,首先我們要向該伺服器發起請求,拿取該檔案,然後分析提取其中的圖片資訊,並整理儲存資料
筆者使用的Python3.6,擷取網頁內容常用的有兩種方式:requests和urllib(合并了python2中的urllib和urllib2),關於擷取網頁內容,請參考這篇:爬蟲基礎:python擷取網頁內容
現在,我們定義一個用來擷取網頁的方法 crawl()
import requestsdef crawl(url, headers): with requests.get(url=url, headers=headers) as response: # 讀取response裡的內容,並轉碼 data = response.content.decode() return data
調用該方法擷取網頁內容:
# 擷取指定網頁內容url = 'http://www.ngchina.com.cn/travel/'headers = {'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36'}content = crawl(url, headers)print(content)編寫Regex,匹配圖片內容
import re# 編寫Regex,匹配圖片內容pattern = r'src="(.*?\.jpg)'complie_re = re.compile(pattern)# 匹配所有符合Regex的內容imgList = complie_re.findall(content)# 針對匹配出來的內容,可能需要進一步處理、篩選才能最終得到我們需要的資料,例如新的link,我們可以去重之後放入到新的url隊列中去,等待下一次抓取# 總之,根據需求來處理# 去重imgList = list(set(imgList))# 去除不合格的圖片imgList = [img for img in imgList if img.startswith('http')]# 輸出for img, i in zip(imgList, range(len(imgList))): print('{}:{}'.format(i, img))'''0:http://image.ngchina.com.cn/2018/0428/20180428110510703.jpg1:http://image.ngchina.com.cn/2018/0130/20180130032001381.jpg2:http://image.ngchina.com.cn/2018/0424/20180424010923371.jpg...37:http://image.ngchina.com.cn/2018/0419/20180419014117124.jpg38:http://image.nationalgeographic.com.cn/2017/1127/20171127121516360.jpg'''
這樣我們就抓取了給定地址中的圖片資訊了,我們選取其中一張:
http://image.ngchina.com.cn/2018/0428/20180428110510703.jpg
入庫並進行下一輪抓取
在我們抓取到指定內容後,我們可以將其存在資料庫儲存;如果是link型的抓取,我們可以建立url隊列,將指定的url中的新的link加入到url隊列來,然後一輪一輪的遍曆抓取,對於隊列url的處理,需要根據具體需求採用相應的策略,以完成相應的任務工作。更多爬蟲資訊可以參考:初始爬蟲。 補充:
在我們編寫Regex時,可以使用線上Regex工具,快速看到匹配結果:菜鳥正則工具,這個地址中還有一些常用的,已經寫好的Regex,如電話、QQ號、網址、郵箱等等,非常好用。