python scrapy 基本の使い方


まずはproject作成

scrapy作成

$ scrapy startproject アプリ名


spider作成

$scrapy genspider スパイダー名


setting.pyの設定変更

# 文字化けしないようにutf-8に設定
FEED_EXPORT_ENCODING = "utf-8"

# ディレイを3秒に設定
DOWNLOAD_DELAY = 3

#文字をenからjaに変更
DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'ja',
}



scrapyは非同期で処理を行うためデータ取得が必ずしも順番通りになりません。
そこで順番通りに処理するには、
setting.pyに追加

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'


spiderのrequestのmeta属性に追加

yield scrapy.Request(url, callback=self.parse, meta={'download_slot': 'my_slot'})


これで順番通り取得可能です。


javascriptに対応するには「pyppeteer」を使うと便利です。

$ pip install scrapy-pyppeteer 


setting.pyで設定追加します

DOWNLOAD_HANDLERS = {
    "http": "scrapy_pyppeteer.handler.ScrapyPyppeteerDownloadHandler",
    "https": "scrapy_pyppeteer.handler.ScrapyPyppeteerDownloadHandler",
}
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"



jacascript対応のサンプルコード

import scrapy
# jacascript対応
import pyppeteer
from scrapy_pyppeteer.page import PageCoroutine

class SumpleSpider(scrapy.Spider):
    name = 'sumple'
    def start_requests(self):
        yield scrapy.Request(
            url="any_url",
            meta=dict(
                pyppeteer=True,
                pyppeteer_page_coroutines=[
                    PageCoroutine("evaluate", "window.scrollBy(0, document.body.scrollHeight)"),
                    PageCoroutine("waitForSelector", "h2"),  
                ],
            ),
            callback=self.parse,
        )
    
    def parse(self, response):
        name = response.css('h1::text').get().strip()
        price = response.css("div span.value::text").get().strip()
        price = price.replace("¥", "").strip()
        images = response.css('img::attr(src)').get()
        yield{
            "name":name,
            "price":price,
            "images":images,
        }