05 Python 爬蟲教學10 所有文章

[爬蟲筆記] Python Scrapy 爬蟲教學:實作 PTT 資料爬取

python scrapy cover photo

此次實作 Python 爬蟲框架 Scrapy 來爬取 Ptt 100 頁的內容。從 Scrapy 安裝、Item 設置、Spiders 編寫到 Scrapy CSS 和 Xpath 抓取資料,詳細記錄 Scrapy 基礎入門步驟教學,提供大家參考,希望此篇爬蟲筆記有幫助到想學習 Scrapy 的朋友。

一、環境設置

1.安裝 Scrapy

pip install scrapy

2.建立第一個 Project

scrapy startproject ptt

輸入後會自動建立一些文件和設定,資料結構如下:

  • scrapy.cfg:基礎設置
  • items.py:抓取條目的結構定義
  • middlewares.py:中間件定義
  • pipelines.py:管道定義,用於抓取數據後的處理
  • settings.py:全局設置
  • spiders\ptt.py:爬蟲主體,定義如何抓取需要的數據
(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 文章標題、文章作者、發文日期、噓推文數、內文網址等等。

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),裡面包含三個屬性:

  1. name (爬蟲命名)
  2. allowed_domains (允許的網域):如果網址不屬於此域名將丟棄,可允許多個網域
  3. start_urls (起始網址) :將從這裡定義的網址抓取,允許多個網址
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’} 來跳過系統判別年齡。

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 方法來介紹:

  1. xpath(): 使用 xpath 語言選擇的節點
  2. css(): 使用 css 語言選擇節點
  3. extract(): 返回被選擇元素字串
  4. extract_first():返回第一個匹配元素字串
  5. re(): 使用正則表達式提取的字串列表
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 命令行進入項目目錄,輸入命令即可運行:

scrapy crawl ptt
 

如果需要對抓取的結果進行保存,只需要在命令行加參數 -o {filename} 即可:

scrapy crawl ptt -o output.json # 輸出為JSON文件
scrapy crawl ptt -o output.csv # 輸出為CSV文件

最後~

▍關於 Python 爬蟲 相關其他文章,可以參考:

▍關於 Python 爬蟲併發的方法 相關文章,可以參考:

▍Python相關教學延伸閱讀:

那麼有關於 [爬蟲筆記] Python Scrapy 爬蟲教學:實作 PTT 資料爬取 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~

有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *