Scrapy / Splash Нажмите на кнопку, затем получите контент с новой страницы в новом окне - PullRequest
0 голосов
/ 05 января 2019

Я сталкиваюсь с проблемой, что когда я нажимаю на кнопку, затем Javascript обрабатывает действие, а затем перенаправляет на новую страницу с новым окном (это похоже на то, когда вы нажимаете на <a> с целью _Blank). В scrapy / splash я не знаю, как получить контент с новой страницы (я имею в виду, я не знаю, как управлять этой новой страницей).

Любой может помочь!

script = """
    function main(splash)
        assert(splash:go(splash.args.url))
        splash:wait(0.5)
        local element = splash:select('div.result-content-columns div.result-title')
        local bounds = element:bounds()
        element:mouse_click{x=bounds.width/2, y=bounds.height/2}
        return splash:html()
    end
"""

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest(url, self.parse, endpoint='execute', args={'lua_source': self.script})

1 Ответ

0 голосов
/ 05 января 2019

Проблема:

Проблема в том, что вы не можете очистить html, что выходит за рамки вашего выбора. При нажатии на новую ссылку, если в нее включен iframe, она редко попадает в область для очистки.

Решение:

Выберите метод выбора нового iframe, а затем перейдите к анализу нового html.

Метод Scrapy-Splash

(Это адаптация решения Михаила Коробова из этого ответа )

Если вы можете получить ссылку src на новой всплывающей странице, она может быть наиболее надежной, однако вы также можете попробовать выбрать iframe следующим образом:

# ...
    yield SplashRequest(url, self.parse_result, endpoint='render.json', 
                        args={'html': 1, 'iframes': 1})

def parse_result(self, response):
    iframe_html = response.data['childFrames'][0]['html']
    sel = parsel.Selector(iframe_html)
    item = {
        'my_field': sel.xpath(...),
        # ...  
    }

Метод Селена

(требуется установка pip selenium, bs4 и, возможно, загрузка драйвера chrome здесь для вашей ОС: Selenium Chromedrivers ) Поддерживает синтаксический анализ Javascript! Woohoo!

С помощью следующего кода это переключит области действия на новый кадр:

# Goes at the top
from bs4 import BeautifulSoup 
from selenium.webdriver.chrome.options import Options
import time

# Your path depends on where you downloaded/located your chromedriver.exe
CHROME_PATH = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
CHROMEDRIVER_PATH = 'chromedriver.exe'
WINDOW_SIZE = "1920,1080"

chrome_options = Options()
chrome_options.add_argument("--log-level=3")
chrome_options.add_argument("--headless") # Speeds things up if you don't need gui
chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)

chrome_options.binary_location = CHROME_PATH

browser = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, chrome_options=chrome_options)

url = "example_js_site.com" # Your site goes here
browser.get(url)
time.sleep(3) # An unsophisticated way to wait for the new page to load.
browser.switch_to.frame(0)

soup = BeautifulSoup(browser.page_source.encode('utf-8').strip(), 'lxml')

# This will return any content found in tags called '<table>'
table = soup.find_all('table') 

Мой любимый из двух вариантов - Selenium, но попробуйте первое решение, если вам удобнее с ним!

...