scrapy 2.3 分析javascript代碼

2021-06-16 16:04 更新

如果所需數(shù)據(jù)是用javascript硬編碼的,則首先需要獲取javascript代碼:

  • 如果javascript代碼在javascript文件中,只需讀取 ?response.text? .
  • 如果javascript代碼在 ?<script/>? HTML頁的元素,使用 selectors 提取其中的文本 ?<script/>? 元素。

一旦有了包含javascript代碼的字符串,就可以從中提取所需的數(shù)據(jù):

  • 你可能會使用 regular expression 以JSON格式提取所需數(shù)據(jù),然后可以使用 ?json.loads()? .

例如,如果javascript代碼包含類似 ?var data = {{"field": "value"}};? 您可以按如下方式提取該數(shù)據(jù):

>>> pattern = r'\bvar\s+data\s*=\s*(\{.*?\})\s*;\s*\n'
>>> json_data = response.css('script::text').re_first(pattern)
>>> json.loads(json_data)
{'field': 'value'}
  • chompjs 提供將JavaScript對象解析為 dict .例如,如果javascript代碼包含 ?var data = {{field: "value", secondField: "second value"}};? 您可以按如下方式提取該數(shù)據(jù):
>>> import chompjs 
>>> javascript = response.css('script::text').get() 
>>> data = chompjs.parse_js_object(javascript) 
>>> data
 {'field': 'value', 'secondField': 'second value'}
  • 否則,使用 js2xml 要將javascript代碼轉(zhuǎn)換為XML文檔,可以使用 selectors .

例如,如果javascript代碼包含 var data = {{field: "value"}}; 您可以按如下方式提取該數(shù)據(jù):

>>> import js2xml
>>> import lxml.etree
>>> from parsel import Selector
>>> javascript = response.css('script::text').get()
>>> xml = lxml.etree.tostring(js2xml.parse(javascript), encoding='unicode')
>>> selector = Selector(text=xml)
>>> selector.css('var[name="data"]').get()
'<var name="data"><object><property name="field"><string>value</string></property></object></var>'
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號