爬取知名社區技術文章_分析_1
軟件運行環境是什麽?
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進行邏輯判斷處理
如何邏輯實現?
- 定義一個函數在http://blog.jobbole.com/all-posts/頁面中解析詳情文章頁面所有的url,交個scrapy下載器去下載,並把下載好的頁面交個另外解析函數去獲取有效字段,解析獲取的圖片url,交給scrapy圖片下載器去下載
- 獲得初始數據,然後對初始數據進行格式化處理,去臟處理,獲取有效數據
- 把有效的字段,通過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