[python爬蟲]利用urllib2爬取百度貼吧帖子相關內容

版本號:Python2.7.5,
所謂爬蟲就是把指定網頁中的指定類型內容通過程序抓取並保存到本地。

工具

- **google chrome**
- **fiddler**

步驟

打開指定帖吧
這裏寫圖片描述

打開fiddler
這裏寫圖片描述

將代理跳到fiddler,選中fiddler0626
這裏寫圖片描述

此時當前頁面會刷新,我們到fiddler去看抓包情況
這裏寫圖片描述
此時我們雙擊序號一的鏈接,inspectors下的raw顯示了此鏈接的請求信息,下面的raw則顯示了此網頁的抓取到的信息,是html類型顯示
這裏寫圖片描述
抓取到信息時,知道這是一個get請求,我們對報頭(inspectors下的raw)進行刪減(下圖藍色部分),在composer下raw點擊executo測試看數據是否有變化
這裏寫圖片描述
對上圖藍色部分進行刪除,點擊executo,在左側查看請求情況
這裏寫圖片描述
result等於200 代表請求成功,這樣多次刪除發現,只留下get 請求依然可以請求數據成功,所以我們只保留get 請求鏈接,並複製其中的http鏈接
這裏寫圖片描述
打開一個新建一個 tieba.py 文件


#coding=UTF-8
import urllib2               **#導入相應庫與函數**
import urllib
import  json
from lxml import etree
import chardet
item={}                             **#新建一個字典**


output = open('baidutb.json','w')                 **#打開一個json文件**
num = int(raw_input('請輸入你要爬取的頁數:'))
i = 1
while i<=num:      #進入循環讀取每頁的帖子
    request = urllib2.Request('http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=utf-8&pn='+str((i-1)*50)+'')  **#由於pn後面的值控制着每頁的鏈接,所以對pn= 後面加上不同的字符串數字,因爲頁數鏈接pn=後面都是50的倍數所以每次進行翻倍**
    response = urllib2.urlopen(request)  #請求鏈接
    resHtml = response.read().decode('utf-8')
    html = etree.HTML(resHtml)
    result = html.xpath('//li[@class=" j_thread_list clearfix"]')       **#在html中運用xpath尋找相應標籤,即每個li[@class=" j_thread_list clearfix]類型的標籤都是相應帖子的源代碼**
    print type(result)
    b=0
    for site in result:      **#循環遍歷這一頁中每個帖子的源碼**
        b+=1
        item['data-field'] = site.attrib['data-field'].strip()
        item['replay'] = site.xpath('./div/div[1]/span')[0].text.strip()    **#得到此貼的回覆數**
        print item['replay']
        item['title'] = site.xpath('./div/div[2]/div[1]/div[1]/a')[0].text.strip()  **#得到此貼的標題**
        item['author_name'] = site.xpath('./div/div[2]/div[1]/div[2]/span')[0].attrib['title'].strip()   **#得到此貼的作者名**
        item['words'] = site.xpath('.//div[@class="threadlist_abs threadlist_abs_onlyline "]')[0].text.strip()   **#得到一樓內容**
        item['replayer'] = site.xpath('.//span[@class="tb_icon_author_rely j_replyer"]')[0].attrib['title'].strip()  **#得到最後回覆人名稱**
        item['replaytime'] =site.xpath('.//span[@class="threadlist_reply_date pull_right j_reply_data"]')[0].text.strip()  **#得到組後回覆時間**


        line = json.dumps(item,ensure_ascii=False)+ '\n'
        output.write('第'+str(i)+'頁 第'+str(b)+'貼-------------------- ')
        output.write(line.encode('utf-8'))


    i+=1
output.close()

此時與tieba.py同目錄的文件夾下應該有baidutb.json文件,裏面數據就是當前貼吧帖子
這裏寫圖片描述

response = urllib2.urlopen(request) #請求鏈接
resHtml = response.read().decode('utf-8')
html = etree.HTML(resHtml)
這三行代碼就是打開鏈接並把鏈接下的所有源代碼放到變量html裏面。那麼我們是怎麼從html裏找到想要的信息的呢?
我們先打開谷歌的xpath插件,
這裏寫圖片描述
然後右擊任意帖子標題選中檢查,得到當前帖子html代碼塊,是一個li 標籤下的a標籤,並且a標籤所在的li標籤就代表當前檢查的帖子
這裏寫圖片描述
這裏寫圖片描述
那麼我們在xpath下根據xpth語法找到所有這種標籤即找到並選中了所有當前頁的帖子
這裏寫圖片描述
那麼
result = html.xpath('//li[@class=" j_thread_list clearfix"]')
就是把所有這種標籤放到result列表裏,同樣就可以便利標籤並用xpath找到標籤裏想要的信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章