【问题标题】:How to scrape a website that render data with JavaScript如何抓取使用 JavaScript 呈现数据的网站
【发布时间】:2019-06-15 07:30:15
【问题描述】:

我正在抓取这个网站https://robertsspaceindustries.com/pledge/ship-upgrades?to-ship=173 我想在“选择你的船”文本右侧获取“箭头”文本

我尝试使用 requests 和 BeautifulSoup 来选择包含文本的标签,当我检查页面时,我可以看到文本在标签之间的位置我尝试使用 soup.select(".name") i 选择它仍然得到空字符串,可能是数据正在使用 Javascript 渲染所以我尝试了 selenium 并尝试在选择它之前等待元素加载,这里仍然没有我的代码

try:
    element = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CLASS_NAME, "name"))
    )

    select_tags = driver.find_elements_by_css_selector(".name")
    for tag in select_tags:
        print(tag.text)
finally:
    driver.quit()

箭头

【问题讨论】:

  • 你是否使用driver.maximize_window()或前提条件来运行最大化状态的浏览器?

标签: python python-3.x selenium web-scraping


【解决方案1】:

对于不需要与页面交互的此类任务,Selenium 可能有点过分了。这只是requests_html 的几行代码:

from requests_html import HTMLSession

url = 'https://robertsspaceindustries.com/pledge/ship-upgrades?to-ship=173'

session = HTMLSession()
r = session.get(url)
r.html.render()
print(r.html.find('.info > .name', first=True).text)

按预期生成Arrow

对于这个特定网站,您还可以在内容的其他地方查看您想要的信息,而无需 JavaScript 支持,例如:

import json

import requests

url = 'https://robertsspaceindustries.com/pledge/ship-upgrades?to-ship=173'

r = requests.get(url)
text = r.text

json_start_text = 'fromShips: '
json_start = text.index(json_start_text) + len(json_start_text)
json_end = text.index(']', json_start)
json_text = text[json_start:json_end + 1]
data = json.loads(json_text)
for ship in data:
    name = ship['name']
    msrp = ship['msrp']
    print(f'{name} {msrp}')

导致

Aurora ES $20.00
P52 Merlin $20.00
Aurora MR $25.00
P72 Archimedes $30.00
Mustang Alpha $30.00
Aurora LX $30.00
...
Arrow $75.00
...

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多