Chạy Javascript khi scrape site bằng Scrapy Python

Khi scrape website mà gặp Next chuyển trang bằng Javascript, thì có lẽ sẽ cần hỗ trợ cho việc xử lý Javascript, giúp chuyển trang.

Nếu phải chọn giải pháp xử lý Javascript, thì tốc độ sẽ chậm hơn so với chỉ sử dụng Scrapy, vì bên cạnh việc xử lý html text, hệ thống sẽ phải xử lý DOM và chạy Javascript.

Dưới đây là 2 giải pháp cho việc này:

1. Sử dụng Selenium 

a. Dùng thư viện webdriver của selenium trong code python (trước đó cần cài Selenium Python)

from selenum import webdriver

import scrapy
from selenium import webdriver

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    allowed_domains = ['ebay.com']
    start_urls = ['http://www.ebay.com/sch/i.html?_odkw=books&_osacat=0&_trksid=p2045573.m570.l1313.TR0.TRC0.Xpython&_nkw=python&_sacat=0&_from=R40']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)

        while True:
            next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a')

            try:
                next.click()

                # get the data and write it to scrapy items
            except:
                break

        self.driver.close()

b. Nếu muốn chạy với chế độ trình duyệt như Firefox, thì có thể sử dụng :

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox()  # can be webdriver.PhantomJS()
browser.get('http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376')

# wait for the select element to become visible
select_element = WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.select-size select.sizeOptions")))

select = Select(select_element)
for option in select.options[1:]:
    print option.text

browser.quit()

Tham khảo:

http://stackoverflow.com/questions/17975471/selenium-with-scrapy-for-dynamic-page

http://stackoverflow.com/questions/10648644/executing-javascript-submit-form-functions-using-scrapy-in-python

2. Sử dụng ScrapyJS

Chạy docker:

$ docker run -p 8050:8050 scrapinghub/splash

Cập nhật settings.py:

SPLASH_URL = 'http://192.168.59.103:8050' 

DOWNLOADER_MIDDLEWARES = {
    'scrapyjs.SplashMiddleware': 725,
}

DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter'

Code:

# -*- coding: utf-8 -*-
import scrapy


class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["koovs.com"]
    start_urls = (
        'http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376',
    )

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                    'endpoint': 'render.html',
                    'args': {'wait': 0.5}
                }
            })

    def parse(self, response):
        for option in response.css("div.select-size select.sizeOptions option")[1:]:
            print option.xpath("text()").extract()

Tham khảo:

http://stackoverflow.com/questions/30345623/scraping-dynamic-content-using-python-scrapy

https://github.com/scrapy-plugins/scrapy-splash

Leave a Reply

Your email address will not be published. Required fields are marked *