javascript - 从 HTML 文件中存在的 JavaScript 代码中抓取数据

标签 javascript python web-scraping scrapy

我正在使用 scrapy(Python) 从 http://www.heteropharmacy.com/outlets.html 中抓取所有地址.城市/城镇下拉列表包含许多城市。每当我选择一个城市时,都会显示新地址。

但是,没有向服务器发出请求。我同时使用了 firebug Lite 和 Chrome 中的开发者工具。没有向服务器发出 POST/GET 请求。

当我查看源代码时,我发现了这一点:

<script src="jScript/myScript.js" type="text/javascript"></script>

单击“jScript/myScript.js”时,我被重定向到 http://www.heteropharmacy.com/jScript/myScript.js .这个源代码是一个javascript文件,在下拉框中包含了所有城市的所有地址。这些地址在一个数组中。

我的问题是如何获取此 javascript 代码的 html 代码,以便我可以使用 scrapy 提取它。或者我可以直接从 javascript 文件中提取。我会感谢所有可能的解决方案,并且愿意使用任何 API,而不仅仅是 Scrapy。

我在网上查了很多,也只能找到对服务器有请求的情况下的解决方案。

最佳答案

这里有多个选项:

  • 使用正则表达式直接从javascript中提取数据
  • 使用 javascript 解析器 直接从 javascript 中提取数据(例如 slimit - example here )
  • 使用ScrapyJS 打包 Splash呈现 javascript
  • selenium 的帮助下让真正的浏览器执行javascript - 浏览器可以是 headless 的(比如 PhantomJS)

如果您选择使用正则表达式,可以通过以下方式制作状态字典 -> 药店列表:

from pprint import pprint
import re

import requests


url = 'http://www.heteropharmacy.com/jScript/myScript.js'
with requests.Session() as session:
    response = session.get(url)

    pattern = re.compile(r"states_arr\['(\w+)'\]= new Array\((.*?)\);", re.MULTILINE | re.DOTALL)

    results = {state: [item.strip()[1:] for item in pharmacies.split('",')]
               for state, pharmacies in pattern.findall(response.content)}

    pprint(results)

打印:

{'Chennai': ['Adambakkam # 044 22530209 # Opp. Murugan Temple, ; Brindavan Nager, ; Mohanpuri - 5th Street, ; Adambakkam, Chennai \x96 600 088',
             'Adambakkam - 2 # 044 - 22553195, 64540549 # No. 2 B, Ground Floor, Ganesh Nagar Main Road, ; Near NGO Colony Bus Stop, Telephone Colony, ; Adambakkam, Chennai - 600088.',
             'Allapakkam # 044- 64520024 # New No.131, Old No.10 M, ; Shop No. F, Alapakkam Main Road, ; Near Jeva Complex, Alapakkam, Chennai-16.',
             'Anna nagar # 044-26220891 # New No.1, AI Block, Second Street, ; Near Anna Adarsh College for Women, ; Shanthi Colony, Anna Nagar, ; Chennai- 600040.',
 ...
 'Visakhapatnam': ['Adarsh Nagar # 9247001943 # H. No. 3-352, Beside Andhra Bank, ; Near Manapuram Finance Ltd. Adarsha Nagar, ; Old Dairy Form, Visakhapatnam',
                   'B.C. Road, Gajuwaka # 0891 2546005  # D. No.13-6-14/1, ; Opp. Dr. T. Dhanalatha Hospital, ; B. C. Road, Gajuwaka, Visakhapatnam.',
                   'Chinawaltair # 0891-2546001, 6464501 # D.No: 6-5-3, Opp. Jaganadh Temple, ; China Waltair, Visakapatnam-17.',
                   'Marripalem #  9247000573 # D. No. 38-40-70,  Opp. Ramalingeswara Alayam, ; Marripalem Main Road, ; Marripalem, Visakhapatnam.',
                   'Muralinagar #  0891-6464507# D.No.39-8-9/5, ; Varma Complex, 48th Bus stop, ; Murali Nagar, Visakhapatnam',
                   'NRI Hospital # 0891-2714453, 6464506 # 50-27-16, Rammahon Chamber, ; Near NRI Hospital, ; Seethammadhara, Visakapatnam.',
                   'Pedawaltair # 0891-2546006 # H.No.8-1-97/2/2, ; Near Vishaka Eye Hospital, ; Pedawaltair junction, Vizag.',
                   'Ramnagar # 0891-2546002, 6464502 # D.No. 10-50-11/2, 1st Floor, ; Beside Care Hospital, Main Road, ; Ramnagar, Visakapatnam.',
                   'Seetammadhara # 0891-2713706, 6464504 # H.No: 55-14-109/1, ; Beside Sri Sivaramareddy Sweets, ; Opp to E- Seva kendram, ; Seetammadhara, Visakhapatnam."']}

关于javascript - 从 HTML 文件中存在的 JavaScript 代码中抓取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498751/

相关文章:

python - BeautifulSoup - 如何从网站提取电子邮件?

javascript - Jquery:挑选出没有 A 类或 B 类的元素

javascript - 如何创建一个 Javascript 监听器,一旦 div 的子项都具有特定的类名,该监听器就会触发事件

javascript - 如何扩展tinyMCE表插件

python - Python 参数中的等号

python - 如何只解析我感兴趣的键?

javascript - 选择当前选择器之后出现的下一个类

python - python中有gdb客户端实现吗?

python - 如何将 MySQL SOUNDEX 函数与 SQLAlchemy 结合使用

网络抓取时的 R 内存管理