Scrapy 및 Scrapy-playwright를 사용하여 동적 Javascript 웹 사이트 스크래핑
12636 단어 datawebscrapingscrapypython
Scrapy는 스크래핑 웹 사이트를 산들 바람으로 만드는 인기있는 Python 패키지입니다. 그러나 정적 페이지에서 가장 잘 작동합니다. 필요에 따라 데이터를 로드하거나 렌더링 및 사용자 입력이 필요한 Javascript가 많은 웹 사이트의 경우 Scrapy는 많은 어려움을 겪습니다.
이 기사에서는 Scrapy를 사용하여 동적 웹 사이트를 긁는 방법을 살펴보겠습니다.
이 예제의 코드here
이 기사는 John Watson Rooney의 비디오에 크게 의존합니다. 그가 웹 스크래핑에 대한 놀라운 비디오를 많이 가지고 있기 때문에 그의 것을 확인하십시오!
의 시작하자. scrapy-playwright을 사용하여 동적 웹 사이트의 스크래핑을 탐색합니다.
참고: 예를 들어
example.com
를 사용합니다. 기존 웹 사이트를 사용하고 싶지 않고 실수로 ddos합니다. 스크래핑은 책임감 있게 수행되어야 하며 스크래핑을 허용하는지 확인하기 위해 항상 웹사이트의 서비스 약관을 읽어야 합니다. 이 문서는 교육 목적으로만 사용됩니다.먼저 가상 환경을 만들고
scrapy
, scrapy-playwright
를 설치하고 극작가를 초기화합니다.$ python -m virtualenv venv
$ source venv/bin/activate
$ pip install scrapy scrapy-playwright
$ playwright install
진행하려면 스크래피 프로젝트가 필요합니다. 운 좋게도 scrapy에는 새 프로젝트를 생성하는 내장 명령이 있습니다. scrapy 프로젝트를 생성하고 새로 생성된 폴더로 변경해 보겠습니다.
$ scrapy startproject playwright_demo
$ cd playwright_demo
다음으로 우리는 새로운 거미를 만들 것입니다.
$ scrapy genspider pwspider example.com
# Output
Created spider 'pwspider' using template 'basic' in module:
playwright_demo.spiders.pwspider
유사한 구조를 가진
playwright_demo
라는 이름의 작업 디렉토리에 새 폴더가 표시되어야 합니다(버전에 따라 python 옆에 다른 숫자가 있을 수 있음)..
├── playwright_demo
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-38.pyc
│ │ └── settings.cpython-38.pyc
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ ├── __init__.py
│ ├── __pycache__
│ │ └── __init__.cpython-38.pyc
│ └── pwspider.py
└── scrapy.cfg
4 directories, 11 files
이제 극작가와 작업할 수 있도록 scrapy의 설정을 수정해야 합니다. 지침은 극작가GitHub page에서 찾을 수 있습니다.
DOWNLOAD_HANDLERS
및 TWISTED_REACTOR
에 대한 설정을 추가해야 합니다. 추가된 새 설정은 ###
사이에서 찾을 수 있습니다.설정 파일은 다음과 같아야 합니다.
# playwright_demo/settings.py
# Scrapy settings for playwright_demo project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://docs.scrapy.org/en/latest/topics/settings.html
# https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
BOT_NAME = 'playwright_demo'
SPIDER_MODULES = ['playwright_demo.spiders']
NEWSPIDER_MODULE = 'playwright_demo.spiders'
### Playwright settings
DOWNLOAD_HANDLERS = {
"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
"https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
###
# More scrapy settings down below...
편집해야 할 또 다른 사항은 거미 자체입니다.
start_requests()
메서드를 추가하고 스파이더에서 몇 줄을 삭제해야 합니다. 파일은 다음과 같습니다.# playwright_demo/spiders/pwspider.py
import scrapy
class PwspiderSpider(scrapy.Spider):
name = 'pwspider'
def start_requests(self):
yield scrapy.Request('example.com', meta={'playwright': True})
def parse(self, response):
yield {
'text': response.text,
}
좋아, 우리는 기본 설정을 얻었다. 이제 스크랩하려는 웹 사이트의 소스를 검사해야 합니다.
우리는 다음과 유사한 것을 찾고 있습니다.
We're sorry, but the site doesn't work properly without Javascript enabled.
이것이 의미하는 바는 실제로 웹사이트를 로드하고 스크랩하려는 데이터를 로드하도록 허용해야 한다는 것입니다.
이 명령으로 스파이더를 실행하고 긁힌 결과를
output_data.json
에 출력하면 데이터를 다시 얻을 수 있습니다.scrapy crawl pwspider -o output_data.json
문제는 우리가 정크 데이터를 얻는다는 것입니다. Scrapy는 우리가 원하는 데이터를 로드할 충분한 시간을 웹 사이트에 제공하지 않습니다.
우리가 하는 일은 스크랩하려는 웹사이트로 이동하여 원하는 항목의 선택기, ID 및 클래스를 찾기 시작하는 것입니다. 우리는 극작가에게 우리가 원하는 데이터가 로드될 때까지 기다렸다가 그 후에야 긁어내라고 말해야 합니다.
meta
메서드 내부의 start_requests
사전을 변경하여 올바른 방향으로 스크래피와 극작가를 가리킵니다. id가 div
인 imaginaryitemName
를 사용하겠습니다. 가격의 경우 가격이 있는 div
를 포함하는 가상의 form-group
label
입니다. 또한 async
메서드 앞에 parse
가 있어야 합니다. 그렇지 않으면 작동하지 않습니다. 다음은 업데이트된 스파이더 파일입니다.# playwright_demo/spiders/pwspider.py
import scrapy
from scrapy_playwright.page import PageCoroutine
class PwspiderSpider(scrapy.Spider):
name = 'pwspider'
def start_requests(self):
yield scrapy.Request('https://twitter.com',
meta=dict(
playwright=True,
playwright_include_page=True,
playwright_page_coroutines=[
# This where we can implement scrolling if we want
PageCoroutine(
'wait_for_selector', 'div#itemName')
]
)
)
async def parse(self, response):
for item in response.css('div.card'):
yield {
'name': item.css('h3::text').get(),
'price': item.css('div.form-group label::text').get()
}
거미를 다시 실행하면:
scrapy crawl pwspider -o output_data.json
출력 파일에는 다음 출력과 유사한 내용이 있습니다.
// output_data.json
[
{"name": "Item1", "price": "$14.99"}
{"name": "Item2", "price": "$19.99"}
{"name": "Item3", "price": "$134.99"}
{"name": "Item4", "price": "$17.99"}
]
이거 야. 이제 동적 웹사이트를 긁는 방법을 알았습니다.
Reference
이 문제에 관하여(Scrapy 및 Scrapy-playwright를 사용하여 동적 Javascript 웹 사이트 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/af/scraping-dynamic-javascript-websites-with-scrapy-5a1m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)