利用Python爬取百度貼吧圖片

背景介紹

我大一的時候學校就開設了 python,但是並沒有好好學,基本等於是什麼也不會,最近纔開始看,所以本身也是摸着石頭過河,見諒...

心得

講真的,爬蟲確實不像別人想象的那樣簡單,爬蟲首先要靜下心來,細心尋找目標網站的佈局規律,最重要的是 url 的變化,這是一個考驗耐心與細心的過程;爬蟲沒有一個固定的套路,我們得時刻周旋於各種反爬蟲機制中,並深陷不能自拔(sorry,廢話太多了),我們只能學習這種爬蟲的思想,一定要多加練習,掌握知識的最佳途徑就是實踐,不要眼高手低,跟着大神的腳步模仿、練習,大神都是這樣一步一步走過來的,加油。。。

遇到的問題

首先我們要知道所謂的爬蟲其實說到原理上就是:1、如何獲取到想要的目標信息?2、如何存入本地?3、如何轉換格式
基於這三點我來簡單說明一下
1、我在爬取百度貼吧的圖片時,剛開始也是一度彷徨,不知道該如何下手,於是我把教程看了好幾遍,又反覆琢磨百度貼吧的html格式,終於我發現了我想要的數據的規律,從變化中尋求規律,這纔是我們爬蟲的解決之道,於是我發現它的 url 每次前半截基本都不會發生變化,並且會跟着相應的翻頁數進行變化,這是第一個規律
2、細心查找之下發現,它的突變的標籤的上下父子節點也基本是固定的,這也給我們帶來了很大的便捷,於是,我就在雖然這個圖片的地址是一直髮生變化的,但是我們可以從它的父子節點入手從而可以拿到這個圖片的url地址,最後拿着這個url去請求圖片然後下載到本地這樣不就行了嘛
3、這樣我們的關注點就變成了如何拿到它的相關的父子節點信息呢?我仔細的查找了相關的知識點,發現在python中,處理html數據的雖然有很多框架可以做到,但是有三大最流行的技術:正則表達式,這個相信不用我多說了,無論什麼語言都有正則表達式,並且由於是各種語言內置的,因此配置簡單,但是使用難度是最高的(果然任何事物都有其有利有弊的一面,無所例外);第二個就是 xpath,這個相對於正則難度就要小點,需要自己熟悉一下它的寫法,並且需要導入lxml這個庫,在下載時需要注意(下載是比較麻煩的,我當時就是搞了好久,版本一值不對,考驗耐心);第三個就是 BeautifulSoup,這個是三個裏面最簡單的一個,比較容易上手,有專門的官方文檔說明(飛機票:https://beautifulsoup.readthe...
4、我個人是比較推薦使用正則表達式的,什麼效率方面的就不說了,推崇的是它的使用面最廣,什麼語言都可以直接使用(由於我本身還使用別的語言,比如java、scala、go、node、python等),所以這也是我特別青睞它的理由(正則基礎一定要學好,慢慢練習,加油哦)
5、接下來就是數據處理了,這裏我是將這些圖片直接保存到本項目下的一個文件夾下面了,後續可以配置數據庫,直接寫入數據中。好了,大致思路就介紹到這裏了,畢竟需要動手做一遍才能理解,歡迎交流(ps:在源碼中也給出了我的私人郵箱哦)

源代碼

#! /usr/bin/env python
# -*- coding:utf-8 -*-

'''
爬取百度貼吧的數據
author : [email protected]
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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章