1. 程式人生 > >學校實訓的第二天

學校實訓的第二天

今天主要學習爬蟲,歡迎大家評論交流。

工具:pycharm專業版(社群版也可以哈,不過功能沒有專業版多),第三方庫:requests、BeautifulSoup4、lxml、html5lib

1、首先我們先來介紹下爬蟲是什麼?

爬蟲,英文名Spider,是一段自動抓取網際網路資訊的程式,從網際網路上抓取對於我們有價值的資訊。

2、那麼爬蟲能用來幹什麼?

利用爬蟲技術抓取公司使用者資訊,分析網站使用者,網路爬蟲技術在商業銀行的應用等等

3、爬蟲的基本流程

(1)發起請求:通過url向伺服器發起request請求,請求可以包含額外的header資訊。
(2)獲取響應內容:如果伺服器正常響應,那我們將會收到一個response,response即為我們所請求的網頁內容,或許包含HTML,Json字串或者二進位制的資料(視訊、圖片)等。
(3)解析內容:如果是HTML程式碼,則可以使用網頁解析器進行解析,如果是Json資料,則可以轉換成Json物件進行解析,如果是二進位制的資料,則可以儲存到檔案進行進一步處理。
(4)儲存資料:可以儲存到本地檔案,也可以儲存到資料庫(MySQL,Redis,Mongodb等)

4、那麼現在我們開始學習爬蟲的編寫

我們以校花網為例(我們的老師一看就是老司機了,一上來就教我們爬這個,哈哈哈),網站為http://www.xiaohuar.com/,下面附上程式碼,有詳細註釋的。
# /usr/bin/env python
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import os       #對目錄的操作:建立、刪除、移動
from urllib.request import urlretrieve      #將遠端資料下載到本地。

#爬取校花資訊
def get_xiaohua_info():
    #定義頭部資訊,模擬瀏覽器提交
    headers={
        'UserAgent':
            'Mozilla / 5.0(WindowsNT6.1;WOW64) AppleWebKit / '
            '537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36'}
    # 模擬瀏覽器發出http請求:get或post方法
    responses = requests.get(url=URL,headers=headers)
    #檢視狀態碼,如果是200則為成功
    #print(responses.status_code)
    if responses.status_code==200:
        #responses.encoding設定編碼格式
        responses.encoding='utf-8'
        #responses.text返回網頁原始碼
        #responses.content返回二進位制數
        #print(responses.text)

        #通過bs4,構造過濾器,篩選內容
        #BeautifulSoup()函式的引數(二進位制內容,指定解析器:html5lib或lxml)
        bs = BeautifulSoup(responses.content,'html5lib')
        #定義過濾規則:div lanmu、div ul、div ul li
        #fina_all()函式引數:根據標籤名字過濾,根據屬性名#value篩選
        div_list = bs.find_all('div',attrs={'class':'all_lanmu'})
        file = open('校花網資料.txt','w',encoding='utf-8')
        txt = ''
        #print(div_list)
        #遍歷all_lanmu列表
        for div_lanmu in div_list:
            div_title = div_lanmu.find('div',attrs={'class':'title'})
            a_title = div_lanmu.find('a')
            #tag.string:獲取標籤內容
            #print(a_title.string)
            lanmu_title = a_title.string
            txt += lanmu_title + '\n\n'
            ul = div_lanmu.find('ul',attrs={'class':'twoline'})
            #判斷是否為空
            if ul != None:
                li_list = div_lanmu.find_all('li')
                #print(li_list)
                #採集目標:名字,學校,點贊,路徑(圖片,二級頁面)
                for li in li_list:
                    name = li.find('span').string
                    school = li.find('b',attrs={'class':'b1'}).string
                    like = li.find('b',attrs={'class':'b2'}).string
                    img_path = li.find('img')['lazysrc']
                    two_page = li.find('a')['href']
                    #print(name,school,like,img_path,two_page)
                    txt += '姓名:'+name+'\n'
                    txt += '學校:' + school + '\n'
                    txt += '點贊:' + like + '\n'
                    txt += '詳情頁:' + two_page + '\n'
                    if URL not in img_path:
                        img_path = URL+img_path
                    txt += '圖片:' + img_path + '\n'
                    get_xiaohua_pic(img_path=img_path,name=name)
        file.write(txt)
        file.close()
    else:
        print('訪問不了')

#爬取校花圖片並下載
def get_xiaohua_pic(img_path,name):
    download = 'download'
    if not os.path.exists(download):
        os.mkdir(download)
    #name = img_path.split('/')  #拆分字串
    #name = name[len(name)-1]    #獲取最後一位的內容
    #捕捉異常
    try:
        urlretrieve(img_path,download+'/'+name+'.jpg')
    except:
        print('SORRY~下載不了')

if __name__ == '__main__':
    #目標網站
    URL = 'http://www.xiaohuar.com/'
    #呼叫函式
    get_xiaohua_info()
建議大家看看beatifulsoup4的用法,個人覺得find和find_all方法還是比較令人頭疼的,當然也可以用lxml來解析頁面,以後有機會會學習。