Scrapy로 쉬운 웹 스크래핑
도움이되면 다행입니다.
참고:
Python - Scrapy를 사용하여 크롤러 만들기
htps : // 이 m / 나카 j / ms / 4b2136b7b5 A4E 2432 8
소요시간 15분
내용
1.Scrapy 설치 및 프로젝트 생성
2.Spider 정보
3. 실제로 웹 페이지 정보를 얻어 보자!
1.Scrapy 설치 및 프로젝트 생성
터미널에서 아래 pip를 실행하고 scrapy 설치
pip install scrapy
그런 다음 scrapy 프로젝트를 만들려는 디렉토리로 이동하여 다음을 실행합시다.
scrapy startproject sake
이 후 일본주관계의 웹사이트를 스크래핑 하므로 프로젝트의 이름을 "sake"에 했습니다
그러면 현재 디렉토리 아래에 다음 폴더가 구성됩니다.
2.Spider 정보
위의 파일만으로는 웹 스크래핑을 할 수 없으므로 아래 명령을 입력하고
spiders 디렉토리에 파일을 작성합니다.
#scrapy genspider <ファイル名> <スクレイピングしたいweb URL>
scrapy genspider scrapy_sake https://www.saketime.jp/ranking/
그러면 spiders 디렉토리 내에 "scrapy_sake.py"라는 파일이 되어 있는 것을 확인할 수 있다고 생각합니다.
작성된 파일의 내용은 다음과 같습니다.
sake/sake/spiders/scrapy_sake.py# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
pass
나중에 자세히 설명하겠지만 이 "def parse"부분을 주로 코딩해 나가게 됩니다.
코딩하기 전에 한 번 정확하게 웹 정보를 얻을 수 있는지 확인합시다.
"def parse"부분에 print 문을 추가하여 취득 정보를 살펴 보겠습니다.
sake/sake/spiders/scrapy_sake.py# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
#passを削除しprint文を追記
print(response)
그리고 아래의 명령을 실행하면 상당히 많은 출력이 돌아옵니다만 그 안에서 확실히 html이 취득되어 있는 것을 확인할 수 있습니다.
실행 명령#scrapy crawl <ファイル名>
scrapy crawl scrapy_sake
출력
<li class="brand_review clearfix">
<div>
<p>
磯自慢 特別本醸造生酒原酒
本日のお酒はこちら、磯自慢の特別本醸造の生原酒!
米は... <br>
<span class="brand_review_user">
by
<span>すーさん</span>
<span>
<span class="review-star">★</span>
<span>4.5</span>
</span>
<span class="reviewtime">
<span>2020年3月23日</span>
</span>
</span>
</p>
</div>
</li>
</ul>
</a>
</div>
:
:
:
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2020, 4, 9, 3, 23, 24, 461847)}
2020-04-09 12:23:26 [scrapy.core.engine] INFO: Spider closed (finished)
그럼 이 다음에 여기에서 필요한 정보만을 꺼내 보자!
3. 실제로 웹 페이지 정보를 얻어 보자!
기본적으로 scrapy로 구현하는 파일은 아래 두 가지뿐입니다.
- items.py
- spiders > scrapy_sake.py
먼저 item.py에서 편집해 봅시다.
우선 열면 원래는 아래의 파일과 같이 되어 있습니다.
sake/items.py# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
pass
이 class 부분에 scrapy로 취득하고 싶은 정보를 임의로 등록합니다.
sake/items.py# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
#取得したい情報名称(任意) = scrapy.Field()
prefecture_maker = scrapy.Field()
prefecture = scrapy.Field()
maker = scrapy.Field()
brand = scrapy.Field()
pass
이것으로, items.py의 기술은 종료입니다.
그런 다음 scrapy_sake.py의 코딩으로 이동합니다.
완성형이 아래와 같습니다.
상기 2장에서 본 것과 비교해 def parse()내가 리치가 되어 있다고 생각합니다.
sake/sake/spiders/scrapy_sake.py# -*- coding: utf-8 -*-
import scrapy
#items.pyをimportすることを忘れないようにしましょう
from sake.items import SakeItem
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
#allowed_domains = ['ja.wikipedia.org']
start_urls = ['https://www.saketime.jp/ranking/']
def parse(self, response):
items = []
#htmlタグのli.clearfixという場所に日本酒情報が格納されていました。
sakes = response.css("li.clearfix")
#ページ内にある複数あるli.clearfixの1つずつをみていく
for sake in sakes:
#item.pyで定義したSakeItemオブジェクトを宣言
item = SakeItem()
item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()
#<div class="headline clearfix">のような記述の場合,headline.clearfixとして間に.をつけること
item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()
#取得したデータのクレンジング
if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
#¥nとスペースの削除
item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
#prefectureとmakerの分離
item["prefecture"] = item["prefecture_maker"].split('|')[0]
item["maker"] = item["prefecture_maker"].split('|')[1]
items.append(item)
print(items)
#ページ切り替えを再起的処理で反映
#aタグのrel="next"の要素をリンク形式で取得する
next_page = response.css('a[rel="next"]::attr(href)').extract_first()
if next_page is not None:
# URLが相対パスだった場合に絶対パスに変換する
next_page = response.urljoin(next_page)
#yieldで1回ずつRequestを返す、リクエスト後のページでsakesが登録され、上のfor文が再度実行される
yield scrapy.Request(next_page, callback=self.parse)
이것을 실행하면 아래와 같습니다.
:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'おろちの舌鼓',
'maker': '木次酒造',
'prefecture': '島根',
'prefecture_maker': '島根|木次酒造'}, {'brand': '禱と稔',
'maker': '福光屋',
'prefecture': '石川',
'prefecture_maker': '石川|福光屋'}, {'brand': '金沢美人',
'maker': '福光屋',
'prefecture': '石川',
'prefecture_maker': '石川|福光屋'}, {'brand': '甚九郎',
'maker': '北雪酒造',
'prefecture': '新潟',
'prefecture_maker': '新潟|北雪酒造'}, {'brand': '兼六桜',
'maker': '中村酒造',
'prefecture': '石川',
'prefecture_maker': '石川|中村酒造'}, {'brand': '誕生',
'maker': '東北銘醸',
'prefecture': '山形',
'prefecture_maker': '山形|東北銘醸'}, {'brand': 'SUMMERGODDESS',
'maker': '真名鶴酒造',
'prefecture': '福井',
:
:
:
'scheduler/dequeued/memory': 221,
'scheduler/enqueued': 221,
'scheduler/enqueued/memory': 221,
'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)
JSON 형식으로 110페이지의 일본술 정보가 20초 정도로 입수할 수 있었습니다.
편리하네요.
자신의 흥미가 있는 사이트등을 스크래핑 해 보고 정보를 취득해 봅시다.
메모
기본 정보이지만 스크래핑하고 싶은 사이트의 html 정보의 견해로는 chrome 브라우저이며 macOS의 경우 cmd + option + i로 표시 할 수 있습니다.
또한 cmd + shift + c를 눌러 사이트의 요소를 클릭하여 html 코드의 어디를 나타내는 지 확인할 수 있습니다.
Reference
이 문제에 관하여(Scrapy로 쉬운 웹 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/D_U_8240/items/7ec882f8ba34c606a795
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
pip install scrapy
scrapy startproject sake
위의 파일만으로는 웹 스크래핑을 할 수 없으므로 아래 명령을 입력하고
spiders 디렉토리에 파일을 작성합니다.
#scrapy genspider <ファイル名> <スクレイピングしたいweb URL>
scrapy genspider scrapy_sake https://www.saketime.jp/ranking/
그러면 spiders 디렉토리 내에 "scrapy_sake.py"라는 파일이 되어 있는 것을 확인할 수 있다고 생각합니다.
작성된 파일의 내용은 다음과 같습니다.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
pass
나중에 자세히 설명하겠지만 이 "def parse"부분을 주로 코딩해 나가게 됩니다.
코딩하기 전에 한 번 정확하게 웹 정보를 얻을 수 있는지 확인합시다.
"def parse"부분에 print 문을 추가하여 취득 정보를 살펴 보겠습니다.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
#passを削除しprint文を追記
print(response)
그리고 아래의 명령을 실행하면 상당히 많은 출력이 돌아옵니다만 그 안에서 확실히 html이 취득되어 있는 것을 확인할 수 있습니다.
실행 명령
#scrapy crawl <ファイル名>
scrapy crawl scrapy_sake
출력
<li class="brand_review clearfix">
<div>
<p>
磯自慢 特別本醸造生酒原酒
本日のお酒はこちら、磯自慢の特別本醸造の生原酒!
米は... <br>
<span class="brand_review_user">
by
<span>すーさん</span>
<span>
<span class="review-star">★</span>
<span>4.5</span>
</span>
<span class="reviewtime">
<span>2020年3月23日</span>
</span>
</span>
</p>
</div>
</li>
</ul>
</a>
</div>
:
:
:
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2020, 4, 9, 3, 23, 24, 461847)}
2020-04-09 12:23:26 [scrapy.core.engine] INFO: Spider closed (finished)
그럼 이 다음에 여기에서 필요한 정보만을 꺼내 보자!
3. 실제로 웹 페이지 정보를 얻어 보자!
기본적으로 scrapy로 구현하는 파일은 아래 두 가지뿐입니다.
- items.py
- spiders > scrapy_sake.py
먼저 item.py에서 편집해 봅시다.
우선 열면 원래는 아래의 파일과 같이 되어 있습니다.
sake/items.py# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
pass
이 class 부분에 scrapy로 취득하고 싶은 정보를 임의로 등록합니다.
sake/items.py# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
#取得したい情報名称(任意) = scrapy.Field()
prefecture_maker = scrapy.Field()
prefecture = scrapy.Field()
maker = scrapy.Field()
brand = scrapy.Field()
pass
이것으로, items.py의 기술은 종료입니다.
그런 다음 scrapy_sake.py의 코딩으로 이동합니다.
완성형이 아래와 같습니다.
상기 2장에서 본 것과 비교해 def parse()내가 리치가 되어 있다고 생각합니다.
sake/sake/spiders/scrapy_sake.py# -*- coding: utf-8 -*-
import scrapy
#items.pyをimportすることを忘れないようにしましょう
from sake.items import SakeItem
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
#allowed_domains = ['ja.wikipedia.org']
start_urls = ['https://www.saketime.jp/ranking/']
def parse(self, response):
items = []
#htmlタグのli.clearfixという場所に日本酒情報が格納されていました。
sakes = response.css("li.clearfix")
#ページ内にある複数あるli.clearfixの1つずつをみていく
for sake in sakes:
#item.pyで定義したSakeItemオブジェクトを宣言
item = SakeItem()
item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()
#<div class="headline clearfix">のような記述の場合,headline.clearfixとして間に.をつけること
item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()
#取得したデータのクレンジング
if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
#¥nとスペースの削除
item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
#prefectureとmakerの分離
item["prefecture"] = item["prefecture_maker"].split('|')[0]
item["maker"] = item["prefecture_maker"].split('|')[1]
items.append(item)
print(items)
#ページ切り替えを再起的処理で反映
#aタグのrel="next"の要素をリンク形式で取得する
next_page = response.css('a[rel="next"]::attr(href)').extract_first()
if next_page is not None:
# URLが相対パスだった場合に絶対パスに変換する
next_page = response.urljoin(next_page)
#yieldで1回ずつRequestを返す、リクエスト後のページでsakesが登録され、上のfor文が再度実行される
yield scrapy.Request(next_page, callback=self.parse)
이것을 실행하면 아래와 같습니다.
:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'おろちの舌鼓',
'maker': '木次酒造',
'prefecture': '島根',
'prefecture_maker': '島根|木次酒造'}, {'brand': '禱と稔',
'maker': '福光屋',
'prefecture': '石川',
'prefecture_maker': '石川|福光屋'}, {'brand': '金沢美人',
'maker': '福光屋',
'prefecture': '石川',
'prefecture_maker': '石川|福光屋'}, {'brand': '甚九郎',
'maker': '北雪酒造',
'prefecture': '新潟',
'prefecture_maker': '新潟|北雪酒造'}, {'brand': '兼六桜',
'maker': '中村酒造',
'prefecture': '石川',
'prefecture_maker': '石川|中村酒造'}, {'brand': '誕生',
'maker': '東北銘醸',
'prefecture': '山形',
'prefecture_maker': '山形|東北銘醸'}, {'brand': 'SUMMERGODDESS',
'maker': '真名鶴酒造',
'prefecture': '福井',
:
:
:
'scheduler/dequeued/memory': 221,
'scheduler/enqueued': 221,
'scheduler/enqueued/memory': 221,
'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)
JSON 형식으로 110페이지의 일본술 정보가 20초 정도로 입수할 수 있었습니다.
편리하네요.
자신의 흥미가 있는 사이트등을 스크래핑 해 보고 정보를 취득해 봅시다.
메모
기본 정보이지만 스크래핑하고 싶은 사이트의 html 정보의 견해로는 chrome 브라우저이며 macOS의 경우 cmd + option + i로 표시 할 수 있습니다.
또한 cmd + shift + c를 눌러 사이트의 요소를 클릭하여 html 코드의 어디를 나타내는 지 확인할 수 있습니다.
Reference
이 문제에 관하여(Scrapy로 쉬운 웹 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/D_U_8240/items/7ec882f8ba34c606a795
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
pass
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
#取得したい情報名称(任意) = scrapy.Field()
prefecture_maker = scrapy.Field()
prefecture = scrapy.Field()
maker = scrapy.Field()
brand = scrapy.Field()
pass
# -*- coding: utf-8 -*-
import scrapy
#items.pyをimportすることを忘れないようにしましょう
from sake.items import SakeItem
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
#allowed_domains = ['ja.wikipedia.org']
start_urls = ['https://www.saketime.jp/ranking/']
def parse(self, response):
items = []
#htmlタグのli.clearfixという場所に日本酒情報が格納されていました。
sakes = response.css("li.clearfix")
#ページ内にある複数あるli.clearfixの1つずつをみていく
for sake in sakes:
#item.pyで定義したSakeItemオブジェクトを宣言
item = SakeItem()
item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()
#<div class="headline clearfix">のような記述の場合,headline.clearfixとして間に.をつけること
item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()
#取得したデータのクレンジング
if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
#¥nとスペースの削除
item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
#prefectureとmakerの分離
item["prefecture"] = item["prefecture_maker"].split('|')[0]
item["maker"] = item["prefecture_maker"].split('|')[1]
items.append(item)
print(items)
#ページ切り替えを再起的処理で反映
#aタグのrel="next"の要素をリンク形式で取得する
next_page = response.css('a[rel="next"]::attr(href)').extract_first()
if next_page is not None:
# URLが相対パスだった場合に絶対パスに変換する
next_page = response.urljoin(next_page)
#yieldで1回ずつRequestを返す、リクエスト後のページでsakesが登録され、上のfor文が再度実行される
yield scrapy.Request(next_page, callback=self.parse)
:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'おろちの舌鼓',
'maker': '木次酒造',
'prefecture': '島根',
'prefecture_maker': '島根|木次酒造'}, {'brand': '禱と稔',
'maker': '福光屋',
'prefecture': '石川',
'prefecture_maker': '石川|福光屋'}, {'brand': '金沢美人',
'maker': '福光屋',
'prefecture': '石川',
'prefecture_maker': '石川|福光屋'}, {'brand': '甚九郎',
'maker': '北雪酒造',
'prefecture': '新潟',
'prefecture_maker': '新潟|北雪酒造'}, {'brand': '兼六桜',
'maker': '中村酒造',
'prefecture': '石川',
'prefecture_maker': '石川|中村酒造'}, {'brand': '誕生',
'maker': '東北銘醸',
'prefecture': '山形',
'prefecture_maker': '山形|東北銘醸'}, {'brand': 'SUMMERGODDESS',
'maker': '真名鶴酒造',
'prefecture': '福井',
:
:
:
'scheduler/dequeued/memory': 221,
'scheduler/enqueued': 221,
'scheduler/enqueued/memory': 221,
'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)
Reference
이 문제에 관하여(Scrapy로 쉬운 웹 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/D_U_8240/items/7ec882f8ba34c606a795텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)