まずは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,
}