此次實作 Python 爬蟲框架 Scrapy 來爬取 Ptt 100 頁的內容。從 Scrapy 安裝、Item 設置、Spiders 編寫到 Scrapy CSS 和 Xpath 抓取資料,詳細記錄 Scrapy 基礎入門步驟教學,提供大家參考,希望此篇爬蟲筆記有幫助到想學習 Scrapy 的朋友。
Table
一、環境設置
1.安裝 Scrapy
1 |
pip install scrapy |
2.建立第一個 Project
1 |
scrapy startproject ptt |
輸入後會自動建立一些文件和設定,資料結構如下:
- scrapy.cfg:基礎設置
- items.py:抓取條目的結構定義
- middlewares.py:中間件定義
- pipelines.py:管道定義,用於抓取數據後的處理
- settings.py:全局設置
- spiders\ptt.py:爬蟲主體,定義如何抓取需要的數據
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
(ptt) │ scrapy.cfg │ └─ptt │ items.py │ middlewares.py │ pipelines.py │ settings.py │ __init__.py │ ├─spiders │ │ ptt.py │ │ __init__.py │ │ │ └─__pycache__ │ __init__.cpython-36.pyc │ └─__pycache__ settings.cpython-36.pyc __init__.cpython-36.pyc items.cpython-36.pyc |
二、撰寫 Scrapy 爬蟲
1.設置 items.py
首先在 items.py 內定義一些想要抓取的項目,本次爬取項目包含 PTT 文章標題、文章作者、發文日期、噓推文數、內文網址等等。
1 2 3 4 5 6 7 8 |
import scrapy class PostItem(scrapy.Item): title = scrapy.Field() author = scrapy.Field() date = scrapy.Field() push = scrapy.Field() url = scrapy.Field() |
2.設置 ptt.py
首先 import 剛剛寫好的 class PostItem (from ptt.items import PostItem),再來 import scrapy 進來。
建立一個 Class 繼承 scrapy.Spider (Scrapy 裡基本的 spider Class),裡面包含三個屬性:
- name (爬蟲命名)
- allowed_domains (允許的網域):如果網址不屬於此域名將丟棄,可允許多個網域
- start_urls (起始網址) :將從這裡定義的網址抓取,允許多個網址
1 2 3 4 5 6 7 8 |
from ptt.items import PostItem import scrapy import time class PTTSpider(scrapy.Spider): name = 'ptt' allowed_domains = ['ptt.cc'] start_urls = ['https://www.ptt.cc/bbs/Gossiping/index.html'] |
此次任務是要爬 PTT Gossiping 版 100 頁的內容,這邊 url 寫了一個迴圈來爬取頁面。開始爬後會發現卡在系統判別是否已滿 18 歲的畫面,所以帶上了 cookies={‘over18′:’1’} 來跳過系統判別年齡。
1 2 3 4 5 |
def parse(self, response): for i in range(100): time.sleep(1) url = "https://www.ptt.cc/bbs/Gossiping/index" + str(39164 - i) + ".html" yield scrapy.Request (url, cookies={'over18': '1'}, callback=self.parse_article) |
scrapy 它有五個基本方法可以定位元素,常用的是 css 或 xpath 方法,進階點可以選擇使用正則,本篇將以 css 方法來介紹:
- xpath(): 使用 xpath 語言選擇的節點
- css(): 使用 css 語言選擇節點
- extract(): 返回被選擇元素字串
- extract_first():返回第一個匹配元素字串
- re(): 使用正則表達式提取的字串列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def parse_article(self, response): item = PostItem() target = response.css("div.r-ent") for tag in target: try: item['title'] = tag.css("div.title a::text")[0].extract() item['author'] = tag.css('div.author::text')[0].extract() item['date'] = tag.css('div.date::text')[0].extract() item['push'] = tag.css('span::text')[0].extract() item['url'] = tag.css('div.title a::attr(href)')[0].extract() yield item except IndexError: pass continue |
三、運行 Scrapy 爬蟲
返回terminal 命令行進入項目目錄,輸入命令即可運行:
1 |
scrapy crawl ptt |
如果需要對抓取的結果進行保存,只需要在命令行加參數 -o {filename} 即可:
1 2 |
scrapy crawl ptt -o output.json # 輸出為JSON文件 scrapy crawl ptt -o output.csv # 輸出為CSV文件 |
最後~
▍關於 Python 爬蟲 相關其他文章,可以參考:
- 【實戰篇】 解析 Python 之父寫的 web crawler 異步爬蟲
- 【Python教學】淺談 Coroutine 協程使用方法
- 【Python教學】Async IO Design Patterns 範例程式
▍關於 Python 爬蟲併發的方法 相關文章,可以參考:
- 【Python教學】淺談 Concurrency Programming
- 【Python教學】淺談 GIL & Thread-safe & Atomic
- 【Python教學】淺談 Multi-processing & Multi-threading 使用方法
- 【Python教學】淺談 Multi-processing pool 使用方法
▍Python相關教學延伸閱讀:
- [Python教學] pip install 指令大全
- [Python教學] 寫給新手的 Python 入門基礎操作
- [Python教學] 使用 pyenv 和 virtualenv 打造 Python 環境配置
- [Git教學] 寫給Git初學者的入門 3 步驟
- Visual Studio Code 必備的 5 個擴充和小常識
那麼有關於 [爬蟲筆記] Python Scrapy 爬蟲教學:實作 PTT 資料爬取 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~
有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!