【问题标题】:Web scraping in Python - extract a value from websitePython 中的网页抓取 - 从网站中提取值
【发布时间】:2020-06-02 08:39:59
【问题描述】:

我正在尝试从该网站中提取两个值:

bizportal.co.il

一个值是从右边开始的美元汇率,从左边开始表示下降/上升百分比。

问题是,在我获得美元汇率值后,由于某种原因,该数字被四舍五入。 (您可以在终端中看到)。我想得到网站上显示的确切数字。

是否有一些友好的 Python 网页抓取文档?

P.S:在 VS 中运行代码时,如何摆脱弹出的 Python 终端窗口?我只希望输出将在 VS 中 - 在交互式窗口中。

my_url = "https://www.bizportal.co.il/forex/quote/generalview/22212222" 
                 
uClient = urlopen(my_url) 
                                                        
page_html = uClient.read()  

uClient.close()                                                                      

page_soup = BeautifulSoup(page_html, "html.parser")                                 

div_class = page_soup.findAll("div",{"class":"data-row"})                      

print (div_class)
#print(div_class[0].text)
#print(div_class[1].text)

【问题讨论】:

  • 看起来像在 BeautifulSoap 中看到的页面确实与您在 Chrome 中看到的不同。我会为这些数据寻找另一个数据源。

标签: python beautifulsoup urllib


【解决方案1】:

数据是通过Ajax动态加载的,但是你可以用requests模块模拟这个请求:

import json
import requests

url = 'https://www.bizportal.co.il/forex/quote/generalview/22212222'
ajax_url = "https://www.bizportal.co.il/forex/quote/AjaxRequests/DailyDeals_Ajax?paperId={paperId}&take=20&skip=0&page=1&pageSize=20"
paper_id = url.rsplit('/')[-1]
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0'}

data = requests.get(ajax_url.format(paperId=paper_id), headers=headers).json()

# uncomment this to print all data:
#print(json.dumps(data, indent=4))

# print first one
print(data['Data'][0]['rate'], data['Data'][0]['PrecentageRateChange'])

打印:

3.4823 -0.76%

【讨论】:

  • 哇,谢谢。它运作良好。我想我应该做很多“功课”。 :)
【解决方案2】:

问题是这个元素是用 Javascript 动态更新的。您将无法使用 urllib 或请求来抓取“最新”值。加载页面时,会填充一个最近的值(可能来自数据库),然后通过 Javascript 将其替换为实时数字。

在这种情况下,最好使用 Selenium 之类的东西来加载网页 - 这允许 javascript 在页面上执行,然后抓取数字。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument("--headless") # allows you to scrape page without opening the browser window
driver = webdriver.Chrome('./chromedriver', options=options)

driver.get("https://www.bizportal.co.il/forex/quote/generalview/22212222")
time.sleep(1) # put in to allow JS time to load, sometimes works without.
values = driver.find_elements_by_class_name('num')
price = values[0].get_attribute("innerHTML")
change = values[1].find_element_by_css_selector("span").get_attribute("innerHTML")

print(price, "\n", change)

输出:

╰─$ python selenium_scrape.py
3.483 
 -0.74%

您应该熟悉 Selenium,了解如何设置和运行它 - 这包括安装浏览器(在这种情况下,我使用的是 Chrome,但您可以使用其他浏览器),了解从何处获取浏览器驱动程序( Chromedriver 在这种情况下)并了解如何解析页面。你可以在这里了解所有内容https://www.selenium.dev/documentation/en/

【讨论】:

  • 哇,感谢您提供的所有信息。我下载了驱动程序并更改了路径。它运作良好。运行代码时终端弹出的烦人的事情。我想将代码嵌入到 gui 中,它不应该弹出。无论如何,我必须做更多的“功课”并阅读它。 Selenium 与其他软件包相比有什么优势?例如使用它而不是上面的例子是一种更好的方式?
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多