Şahsen scrapy ve selenyum kullanmayı ve her ikisini de ayrı kaplarda kullanmayı tercih ederim. Bu şekilde hem minimum güçlükle kurabilir, hem de hemen hemen hepsi bir biçimde javascript içeren modern web sitelerini tarayabilirsiniz. İşte bir örnek:
scrapy startproject
Kazıyıcı oluşturmak ve örümcek yazmak için kullanın, iskelet bu kadar basit olabilir:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['https://somewhere.com']
def start_requests(self):
yield scrapy.Request(url=self.start_urls[0])
def parse(self, response):
# do stuff with results, scrape items etc.
# now were just checking everything worked
print(response.body)
Gerçek sihir midwares.py'de olur. İndirici katman içinde iki yöntem üzerine yaz, __init__
ve process_request
şu şekilde:
# import some additional modules that we need
import os
from copy import deepcopy
from time import sleep
from scrapy import signals
from scrapy.http import HtmlResponse
from selenium import webdriver
class SampleProjectDownloaderMiddleware(object):
def __init__(self):
SELENIUM_LOCATION = os.environ.get('SELENIUM_LOCATION', 'NOT_HERE')
SELENIUM_URL = f'http://{SELENIUM_LOCATION}:4444/wd/hub'
chrome_options = webdriver.ChromeOptions()
# chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
self.driver = webdriver.Remote(command_executor=SELENIUM_URL,
desired_capabilities=chrome_options.to_capabilities())
def process_request(self, request, spider):
self.driver.get(request.url)
# sleep a bit so the page has time to load
# or monitor items on page to continue as soon as page ready
sleep(4)
# if you need to manipulate the page content like clicking and scrolling, you do it here
# self.driver.find_element_by_css_selector('.my-class').click()
# you only need the now properly and completely rendered html from your page to get results
body = deepcopy(self.driver.page_source)
# copy the current url in case of redirects
url = deepcopy(self.driver.current_url)
return HtmlResponse(url, body=body, encoding='utf-8', request=request)
Settings.py dosyasındaki sonraki satırları kaldırarak bu aracıyı etkinleştirmeyi unutmayın:
DOWNLOADER_MIDDLEWARES = {
'sample_project.middlewares.SampleProjectDownloaderMiddleware': 543,}
Bağlantı istasyonu için bir sonraki. Senin oluşturma Dockerfile
gereksinimlerini yüklemek, hafif görüntüden (kullanıyorum piton burada Alpin) buna proje dizinine kopyalayın:
# Use an official Python runtime as a parent image
FROM python:3.6-alpine
# install some packages necessary to scrapy and then curl because it's handy for debugging
RUN apk --update add linux-headers libffi-dev openssl-dev build-base libxslt-dev libxml2-dev curl python-dev
WORKDIR /my_scraper
ADD requirements.txt /my_scraper/
RUN pip install -r requirements.txt
ADD . /scrapers
Ve son olarak hepsini bir araya getirin docker-compose.yaml
:
version: '2'
services:
selenium:
image: selenium/standalone-chrome
ports:
- "4444:4444"
shm_size: 1G
my_scraper:
build: .
depends_on:
- "selenium"
environment:
- SELENIUM_LOCATION=samplecrawler_selenium_1
volumes:
- .:/my_scraper
# use this command to keep the container running
command: tail -f /dev/null
Koş docker-compose up -d
. Bunu ilk kez yapıyorsanız, en son selenyum / bağımsız kromu getirmesi ve sıyırıcı görüntünüzü oluşturması biraz zaman alacaktır.
Tamamlandığında, kaplarınızın çalışıp çalışmadığını kontrol edebilir docker ps
ve ayrıca selenyum kabının adının sıyırıcı kabımıza geçirdiğimiz ortam değişkeninin adıyla eşleşip eşleşmediğini kontrol edebilirsiniz (burada, öyleydi SELENIUM_LOCATION=samplecrawler_selenium_1
).
Kazıyıcı kabınızı girin, docker exec -ti YOUR_CONTAINER_NAME sh
benim için komut docker exec -ti samplecrawler_my_scraper_1 sh
, doğru dizine cd ve kazıyıcıyı çalıştırın scrapy crawl my_spider
.
Tüm şey benim github sayfasından olduğunu ve mal alabilirsiniz burada