gpt4 book ai didi

python - Scrapy/Splash 单击按钮,然后从新窗口中的新页面获取内容

转载 作者:行者123 更新时间:2023-12-01 01:18:50 24 4
gpt4 key购买 nike

我遇到一个问题,当我单击按钮时,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})

最佳答案

问题:

无法抓取超出选择范围的html的问题。当点击新链接时,如果涉及 iframe,则很少会将其纳入抓取范围。

解决方案:

选择选择新 iframe 的方法,然后继续解析新 html。

Scrapy-Splash 方法

(这是 Mikhail Korobov 解决方案的改编,来自 this answer)

如果您能够获取弹出的新页面的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(...),
# ...
}

Selenium 方法

(需要 pip install selenium、bs4,可能还需要从这里下载适合您操作系统的 chrome 驱动程序: Selenium Chromedrivers )支持 Javascript 解析!哇哦!

使用以下代码,这会将范围切换到新框架:

# 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,但如果您更喜欢它,请尝试第一个解决方案!

关于python - Scrapy/Splash 单击按钮,然后从新窗口中的新页面获取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54048624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com