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 scrapyfrom selenium import webdriverclass 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 webdriverfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import Byfrom 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 visibleselect_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
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 scrapyclass 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