我大一的時候學校就開設了 python,可是並無好好學,基本等因而什麼也不會,最近纔開始看,因此自己也是摸着石頭過河,見諒...html
講真的,爬蟲確實不像別人想象的那樣簡單,爬蟲首先要靜下心來,細心尋找目標網站的佈局規律,最重要的是 url 的變化,這是一個考驗耐心與細心的過程;爬蟲沒有一個固定的套路,咱們得時刻周旋於各類反爬蟲機制中,並深陷不能自拔(sorry,廢話太多了),咱們只能學習這種爬蟲的思想,必定要多加練習,掌握知識的最佳途徑就是實踐,不要眼高手低,跟着大神的腳步模仿、練習,大神都是這樣一步一步走過來的,加油。。。java
首先咱們要知道所謂的爬蟲其實說到原理上就是:一、如何獲取到想要的目標信息?二、如何存入本地?三、如何轉換格式
基於這三點我來簡單說明一下
一、我在爬取百度貼吧的圖片時,剛開始也是一度彷徨,不知道該如何下手,因而我把教程看了好幾遍,又反覆琢磨百度貼吧的html格式,終於我發現了我想要的數據的規律,從變化中尋求規律,這纔是咱們爬蟲的解決之道,因而我發現它的 url 每次前半截基本都不會發生變化,而且會跟着相應的翻頁數進行變化,這是第一個規律
二、細心查找之下發現,它的突變的標籤的上下父子節點也基本是固定的,這也給咱們帶來了很大的便捷,因而,我就在雖然這個圖片的地址是一直髮生變化的,可是咱們能夠從它的父子節點入手從而能夠拿到這個圖片的url地址,最後拿着這個url去請求圖片而後下載到本地這樣不就好了嘛
三、這樣咱們的關注點就變成了如何拿到它的相關的父子節點信息呢?我仔細的查找了相關的知識點,發如今python中,處理html數據的雖然有不少框架能夠作到,可是有三大最流行的技術:正則表達式,這個相信不用我多說了,不管什麼語言都有正則表達式,而且因爲是各類語言內置的,所以配置簡單,可是使用難度是最高的(果真任何事物都有其有利有弊的一面,無所例外);第二個就是 xpath,這個相對於正則難度就要小點,須要本身熟悉一下它的寫法,而且須要導入lxml這個庫,在下載時須要注意(下載是比較麻煩的,我當時就是搞了很久,版本一值不對,考驗耐心);第三個就是 BeautifulSoup,這個是三個裏面最簡單的一個,比較容易上手,有專門的官方文檔說明(飛機票:https://beautifulsoup.readthe...)
四、我我的是比較推薦使用正則表達式的,什麼效率方面的就不說了,推崇的是它的使用面最廣,什麼語言均可以直接使用(因爲我自己還使用別的語言,好比java、scala、go、node、python等),因此這也是我特別青睞它的理由(正則基礎必定要學好,慢慢練習,加油哦)
五、接下來就是數據處理了,這裏我是將這些圖片直接保存到本項目下的一個文件夾下面了,後續能夠配置數據庫,直接寫入數據中。好了,大體思路就介紹到這裏了,畢竟須要動手作一遍才能理解,歡迎交流(ps:在源碼中也給出了個人私人郵箱哦)node
#! /usr/bin/env python # -*- coding:utf-8 -*- ''' 爬取百度貼吧的數據 author : shiro.liang.yi@gmail.com data : 2018-11-07 22:27 ''' import urllib2 import urllib def loadPage(url,filename): """ 做用:根據 url 發送請求,獲取服務器響應文件 :param url: 須要爬取的 url 地址 :return: """ print "正在下載 " + filename request = urllib2.Request(url,headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}) response = urllib2.urlopen(request) return response.read() def writePage(html, filename): """ 做用:將 html 內容寫入到本地 :param html: 服務器響應文件內容 :return: """ print "正在保存 " + filename # 文件寫入 with open(filename.decode('utf-8'), "w") as f: f.write(html) print "-" * 30 def tiebaSpider(url, beginPage, endPage): """ 做用:貼吧爬蟲調度器,負責組合處理每一個頁面的 url url : 貼吧 url 的前部分 beginPage:起始頁 endPage:結束頁 :return: """ for page in range(beginPage, endPage + 1): pn = (page - 1) * 50 filename = "第" + str(page) + "頁.html" fullurl = url + "&pn=" + str(pn) print fullurl html = loadPage(fullurl,filename) #print html writePage(html,filename) if __name__ == "__main__": kw = raw_input("請輸入須要爬取的貼吧名:") beginPage = int(raw_input("請輸入起始頁:")) endPage = int(raw_input("請輸入結束頁:")) url = "http://tieba.baidu.com/f?" key = urllib.urlencode({"kw" : kw}) fullurl = url + key tiebaSpider(fullurl,beginPage,endPage)
原創手敲不易,轉載請註明出處,謝謝。我是拉丁小毛,歡迎你們關注我哦,一塊兒交流,共同進步。有問題能夠
郵我哦(util.you.com@gmail.com)