Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态JS在抓取站点时生成的代码_Python_Python 3.x_Web_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 动态JS在抓取站点时生成的代码

Python 动态JS在抓取站点时生成的代码,python,python-3.x,web,web-scraping,beautifulsoup,Python,Python 3.x,Web,Web Scraping,Beautifulsoup,我是个刮痧新手。我正试图通过按钮立即购买获取价值 我尝试过的选项是: 从PyQt4.QtGui导入QApplication 从PyQt4.QtCore导入QUrl 从PyQt4.QtWebKit导入QWebPage 类客户端(QWeb页): 定义初始化(自): self.app=QApplication(sys.argv) QWebPage.\uuuuu init\uuuuuuuuuu(自我) #self.loadFinished.connect(self.on\u页面\u加载) #self.m

我是个刮痧新手。我正试图通过按钮立即购买获取价值
我尝试过的选项是:

从PyQt4.QtGui导入QApplication
从PyQt4.QtCore导入QUrl
从PyQt4.QtWebKit导入QWebPage
类客户端(QWeb页):
定义初始化(自):
self.app=QApplication(sys.argv)
QWebPage.\uuuuu init\uuuuuuuuuu(自我)
#self.loadFinished.connect(self.on\u页面\u加载)
#self.mainFrame().load(QUrl(url))
#self.app.exec()
页面上的def加载(自):
self.app.quit()
def mypage(自我,url):
self.loadFinished.connect(self.on\u页面\u加载)
self.mainFrame().load(QUrl(url))
self.app.exec()
client_response=client()
def解析(url):#OSRS+RS3
客户端响应.mypage(url)
source=client\u response.mainFrame().toHtml()
soup=BeautifulSoup(源代码“html.parser”)
osrs_text=soup.findAll('input',attrs={'type':'number'})
数量=(osrs_文本[0])['min']
最终=0
如果(数量='1'):
final_osrs=round(float(soup.findAll('span',attrs={'id':'goldprice'})[0].text),3)
打印(最终报告)
其他:
price=round(float(soup.findAll('span',attrs={id':'goldprice'})[0].text),3)
最终价格=价格/整数(数量)
打印(最终版本3)
这种方法不好,因为它需要花费太多的时间我也尝试了Selenium方法,但目前还不需要。
你们能给我建议更好的方法来获取价值吗。 任何帮助都将不胜感激。谢谢




注:我尝试了这个库,因为内容是动态生成的。

我不确定您将获得多大的性能差异,但您可以尝试并检查这个解决方案

import requests
from bs4 import BeautifulSoup

baseUrl = 'https://www.rsmalls.com/osrs-gold'
postUrl = 'https://www.rsmalls.com/index.php?route=common/quickbuy/rsdetail'

with requests.Session() as session:
    res = session.get(baseUrl)
    soup = BeautifulSoup(res.text, 'lxml')
    game_id = soup.select_one("#choose-game > option[selected]")['value']
    response = session.post(postUrl, data={'game_id': game_id}).json()
    print(f"{'Gold Price:'} {response['price']}")
在这段代码中,首先我得到的id是“Runescape 2007”,以防网站所有者更改它。您可以跳过该步骤,直接将值“345”作为id提供给下一个post请求,前提是您确定它不会更改

正如你提到的,这个价格是用JS代码加载的。使用浏览器开发工具,我可以获得获得价格的实际POST请求,这需要从下拉列表中选择id。对的POST请求会给出一个json响应,如:

{"success":true,"product_id":"30730","price":0.85,"server_id":"1661","server_option":"463","quantity":"1|5|10|20|50|100|200|300|500|1000|1500|2000","name":"M"}
因此,我将响应解析为json并从中获得了价格。
如果你有任何问题,请告诉我

编辑:

上有不同的POST请求,因此相同的解决方案不起作用。每个页面/网站/数据的帖子请求可能不同。 您可以使用浏览器开发工具自己查找此类post请求,如下所示。在右边,您可以看到对URL发出POST请求,在底部您还可以找到发送到POST请求的数据。还请注意,在对该请求的响应中,它总是以1个单元的价格进行响应,因此如果网站上的默认单元数超过1(如下面屏幕截图中的5),则可能不匹配


附加侧注。您甚至不需要导入json,因为请求已经内置了该函数。因此,您可以将这两行代码合并为:“json_res=sea.post(…).json()”,但对于这个网站来说,它不起作用。感谢@chitown88和SIM改进了我的代码。对于一个新的贡献者,这是一个很好的问题1.记住使用代码片段工具via插入html。优化问题也可能是候选人-尽管一定要阅读他们的指导之前张贴。