1. 什麼是爬蟲
- 也叫網絡爬蟲,簡單來說,爬蟲就是從一個根網站出發,根據某種規則獲得更多的相關網站的url,自動下載這些網頁並自動解析這些網頁的內容,從中獲取需要的數據。例如爬取某種圖片、某類文本信息等。爬蟲還可以用於編纂搜索引擎的網絡索引。
- 爬蟲所涉及的知識和技術面非常廣,在本文中不作討論;爬蟲有很多種實現方法,本文提供的python方法僅是其中一種簡單的實現,適用於規模較小的、自娛自樂的應用。有機會會持續更新。
- 爬蟲會消耗目標系統的資源,作爲一個遵紀守法、品德高尚的好市民,應該考慮目標系統是否願意被爬蟲訪問、負載等問題,以及所爬取的內容是否得當、爬取內容的用途等問題。
- 這僅僅是本人目前對爬蟲的一個很淺層面的理解,望各位輕噴。
2. 目的
- 實現爬蟲的所有代碼已上傳至github: spiderMyCsdn。
- 定時爬取自己的csdn博客頁面信息
- 解析信息爲:閱讀量(views)、粉絲數(fans)、喜歡數(likey)、評論數(comment)、積分(score)、排名(rank)、等級(level)、原創文章數(origin)
- 結果存爲output-timestamp.csv,另將結果導入本地已手動創建的的mysql數據庫中
- 每天定時爬取信息並將解析結果通過郵件發送給自己
3. 爬蟲的整體框架
4. 工程目錄結構
- /config
- config.ini
- /log
- /result
- /src
- __init__.py
- spider_main.py
- url_manerger.py
- html_downloader.py
- html_parser.py
- outputer.py
- log.py
- mysql.py
- main.py
- cronTask.sh
5. 日誌模塊(log.py)
目的是爲了規範輸出日誌,方便後期查看處理日誌、調試代碼,應該養成良好的、規範的日誌習慣
下面是日誌模塊的代碼:
# log.py
# conding=utf-8
import datetime
import logging
import logging.handlers
def setup_custom_logger(name):
# logger settings
time_format = "%Y-%m-%d-%H-%M-%S"
time_now = datetime.datetime.now()
log_file = "log/log_%s.log" %time_now.strftime(time_format) # 輸出的日誌的文件路徑和文件名
log_file_max_size = 1024 * 1024 * 20 # megabytes
log_num_backups = 3
log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s"
log_date_format = "%m/%d/%Y %I:%M:%S %p"
log_filemode = "w" # w:overwrite a:append
# setup logger
# datefmt=log_date_format
logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG)
rotate_file = logging.handlers.RotatingFileHandler(
log_file, maxBytes=log_file_max_size, backupCount=log_num_backups
)
logger = logging.getLogger(name)
logger.addHandler(rotate_file)
# print log messages to console
consoleHandler = logging.StreamHandler()
logFormatter = logging.Formatter(log_format)
consoleHandler.setFormatter(logFormatter)
logger.addHandler(consoleHandler)
return logger
- 使用日誌模塊輸出日誌的示例:
# coding=utf-8
import logging
# 導入自定義的日誌模塊
import log
# 定義日誌名稱,目的是爲了在整個工程文件中能通過名稱找到對應的日誌對象
logger_name = 'spiderCsdn'
# 創建/獲取名稱爲logger_name的日誌對象
logger = logging.getLogger(logger_name)
def main():
# 輸出信息
logger.info('This is an information.')
# 輸出錯誤信息
logger.error('This is an error information.')
if __name__ == '__main__':
main()
輸出結果如下所示,以下內容會保存在/log/log_2018-04-10-20-41-56.log
2018-04-10 20:41:56,733 [INFO]: test.py(main:12) >> This is an information.
2018-04-10 20:41:56,733 [ERROR]: test.py(main:14) >> This is an error information.
6. 全局配置模塊(config.ini)
- 搭配python自帶的
ConfigParser
的package,可以按key值取出提前配置好的內容。 - 主要是方便代碼移植,比如數據庫的登錄密碼更改後,直接在
config.ini
中更改即可,不需要去翻每一個用到數據庫配置的代碼文件,避免可能改漏的情況。 - 以下是配置文件的書寫示例:
# config.ini
# 注意從這裏取出的內容都是字符串,即使不加引號
# []內是key值,不區分大小寫
# 每一個key值下可以有多個變量
[logger]
logger_name = spiderCsdn
- 取配置內容示例:
# 導入ConfigParser模塊
import ConfigParser
# 創建一個config解析器對象
config = ConfigParser.ConfigParser()
# 讀取配置文件
config.read('config/config.ini')
# 按key值和變量名獲取變量內容
# logger_name = 'spiderCsdn'
logger_name = config.get('logger', 'logger_name')
# 使用獲取到的內容
logger = log.setup_custom_logger(logger_name)
接下來會介紹URL管理器和html下載器的內容:python簡單爬蟲:爬取並統計自己博客頁面的信息(二);
如果想看整個工程的代碼,可以戳 github: spiderMyCsdn。
謝謝大家~