1. 程式人生 > >爬取知名社區技術文章_分析_1

爬取知名社區技術文章_分析_1

邏輯結構 project connect primary python 邊界值分析 顯示 result article

軟件運行環境是什麽?

python 3.50 -- 解釋器

scrapy庫 -- 爬蟲框架

pymsql庫 -- 連接mysql數據庫

pillow庫 -- 下載圖片

目標網站是什麽?

伯樂在線:http://blog.jobbole.com/ 所有的技術文章

需要爬取哪些數據?

文章對應的url cont_url varchar(512)

  文章標題 title varchar(36)

  文章發布時間 publish_time data(1970-1-1)

  文章內容 cont longtext

  對應圖片url img_url varchar(512)

  下載對應的圖片 scrapy帶的下載器

  文章點贊數 like_num int(12)

  文章收藏數 collection_num int(12)

  文章評論數 comment_num int(12)

對於這些數據如何設計表?

每個數據都是文章的詳情頁面的唯一數據,不存在冗余數據,所有一張表就可以了

表名:jobbole_article

主鍵:把文章對應的url進行md5處理,做primarykey int(64)

事先把數據表建立起來,pymysql只需要插入數據就行了

如何進行事先分析?

  打開這個域名,瀏覽一下網頁,分析網頁的域名設計,分析有沒有顯示全部文章的url,發現 “最新文章” 這個鏈接地址,直接把所有的文章都顯示出來,就以這個為起始網頁,這個網站為:http://blog.jobbole.com/all-posts/

  分析這個網頁可以獲得的數據,發現可以獲得詳情文章頁面url有20個、文章對應的圖片、下一頁的url,通過詳情頁面,進入可以爬取符合需求的值,通過下一頁url,就可以獲取下一頁的所有文章詳情的url

  邊界值分析:

    試著點開第二頁,分析上一頁url和下一頁url區別

    試著點到最後一頁,發現沒有下一頁url,這時爬蟲應該結束了,需要對爬取下一頁的url進行邏輯判斷處理

如何邏輯實現?

  1. 定義一個函數在http://blog.jobbole.com/all-posts/頁面中解析詳情文章頁面所有的url,交個scrapy下載器去下載,並把下載好的頁面交個另外解析函數去獲取有效字段,解析獲取的圖片url,交給scrapy圖片下載器去下載
  2. 獲得初始數據,然後對初始數據進行格式化處理,去臟處理,獲取有效數據
  3. 把有效的字段,通過pymysql連接數據庫,並寫入數據庫

邏輯結構如何?

該爬蟲分為:5個邏輯結構

解析文章簡介頁面

解析文章詳情頁面

獲得原始數據

數據去臟處理

寫入數據庫(通過twisted的異步框架實現異步存儲)

出現的問題?

如何異步實現數據庫的插入?

#聲明:代碼邏輯而已,參考
#1. 在setting中寫入數據庫連接配置詳細
#2. 定義一個類:
from twisted.enterprice import adbapi

class TwistSql(object)

       def __init__(self, dbpool):

              self.dbpool = dbpool          # 接收fromz_setting傳入的dbpool對象

       @classmethod

       def  fromz_setting(cls,setting):                      # 一個獲取setting值的方法

              db_setting = setting[‘db_setting’]            # 獲取配置文章中數據庫配置信息

charset=’utf8’ 、cursorclass = pymysql.cursors.DictCursor 、use_unicded=Terue 必寫入字典

              dbpool = adbapi.ConnectionPool(‘pymysql’,**kwarg)   # 生成一個pool對象

       return cls(dbpool)       # 因為classmethod類方法,return 會把參數傳給這個類

       def process_item(self, item, spider): # twisted 將mysql插入變成異步

              query = self.dbpool.runInteraction(self.insert_go, item)

# 把傳入的函數變成異步執行,可以返回一個對象

              query.addErrorback(self. handle_error, item, spider)   # 添加異常處理

       def handle_error(self, failur, item, spider):

              print(failur)

       def insert_go(self, cursor, item):       # 這個cursor和pymysql生成的遊標類似

                     #執行具體的插入

              sql_insert = sql語句拼接

              cursor.execute(sql_insert)              

# cursor為遊標,twisted幫做了連接拿到遊標,並且自動會commit

如何自動下載圖片並且獲得圖片下載的路徑?

# 聲明,代碼邏輯而已,僅供參考
setting:

         註冊時候,把自定義類加入

                            IMAGES_URLS_FILED = “img_url”

# img_url 為圖片的下載路徑,Items中必有該字段且img_ur 為數組模式,需要在爬蟲主程序中把這個字段改成數組

                                   import os

                                   project_dir = os.path.abspath(os.path.dirname(__file__)                 

# 獲得工程路徑

                                   IMAGES_STORE = os.path.join(project_dir, ‘images’)        # 字符串拼接

                                          # 設置圖片下載路徑

                     pipelines:

                            form scrapy.piplines.image import ImagePipeline

                            重載ImagePipeline中一個方法

                class MyImagePipline(ImagePipeline):

                       def item_completed(self, results,info):  # result 中包含圖片存放路徑

                              for k,v in result:

                                     img_path = v(‘path’)                 

# k為圖片獲取狀態,True為獲取成功

# v為圖片路徑

                              return item[‘img_path’] = img_path

圖片處理類的優先級應該設置為最先

  

爬取知名社區技術文章_分析_1