gpt4 book ai didi

python - Scrapy,在 Javascript 中抓取数据

转载 作者:IT老高 更新时间:2023-10-28 20:33:58 24 4
gpt4 key购买 nike

我正在使用 scrapy筛选从网站上抓取的数据。但是,我想要的数据不在 html 本身中,而是来自 javascript。所以,我的问题是:

如何获取此类案例的值(文本值)?

这是我要筛选的网站: https://www.mcdonalds.com.sg/locate-us/

我想要获得的属性:地址、联系方式、营业时间。

如果您在 chrome 浏览器中执行“右键单击”、“查看源代码”,您将看到这些值本身在 HTML 中不可用。


编辑

对不起,保罗,我照你说的做了,找到了 admin-ajax.php 并看到了正文,但是,我现在真的卡住了。

如何从 json 对象中检索值并将其存储到我自己的变量字段中?如果你能分享一下如何为公众和那些刚开始使用scrapy的人只做一个属性,那就太好了。

这是我目前的代码

Items.py

class McDonaldsItem(Item):
name = Field()
address = Field()
postal = Field()
hours = Field()

McDonalds.py

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
import re

from fastfood.items import McDonaldsItem

class McDonaldSpider(BaseSpider):
name = "mcdonalds"
allowed_domains = ["mcdonalds.com.sg"]
start_urls = ["https://www.mcdonalds.com.sg/locate-us/"]

def parse_json(self, response):

js = json.loads(response.body)
pprint.pprint(js)

抱歉进行长时间编辑,简而言之,我如何将 json 值存储到我的属性中?例如

***item['address'] = * 如何检索****

P.S,不确定这是否有帮助,但是,我在 cmd 行上运行这些脚本使用

scrapy crawl mcdonalds -o McDonalds.json -t json(将我所有的数据保存到一个json文件中)

对于我的感激之情,我怎么强调都不为过。我知道问你这个有点不合理,即使你没有时间也完全可以。

最佳答案

(我将此发布到 scrapy-users 邮件列表,但根据 Paul 的建议,我将其发布在这里,因为它通过 shell 命令交互补充了答案.)

通常,使用第三方服务来呈现某些数据可视化( map 、表格等)的网站必须以某种方式发送数据,并且在大多数情况下,这些数据可以从浏览器访问。

对于这种情况,检查(即浏览浏览器发出的请求)显示数据是从 POST 请求加载到 https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php

所以,基本上你已经准备好以漂亮的 json 格式使用的所有数据了。

Scrapy 提供了 shell 命令,非常方便在编写蜘蛛之前与网站一起思考:

$ scrapy shell https://www.mcdonalds.com.sg/locate-us/
2013-09-27 00:44:14-0400 [scrapy] INFO: Scrapy 0.16.5 started (bot: scrapybot)
...

In [1]: from scrapy.http import FormRequest

In [2]: url = 'https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php'

In [3]: payload = {'action': 'ws_search_store_location', 'store_name':'0', 'store_area':'0', 'store_type':'0'}

In [4]: req = FormRequest(url, formdata=payload)

In [5]: fetch(req)
2013-09-27 00:45:13-0400 [default] DEBUG: Crawled (200) <POST https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php> (referer: None)
...

In [6]: import json

In [7]: data = json.loads(response.body)

In [8]: len(data['stores']['listing'])
Out[8]: 127

In [9]: data['stores']['listing'][0]
Out[9]:
{u'address': u'678A Woodlands Avenue 6<br/>#01-05<br/>Singapore 731678',
u'city': u'Singapore',
u'id': 78,
u'lat': u'1.440409',
u'lon': u'103.801489',
u'name': u"McDonald's Admiralty",
u'op_hours': u'24 hours<br>\r\nDessert Kiosk: 0900-0100',
u'phone': u'68940513',
u'region': u'north',
u'type': [u'24hrs', u'dessert_kiosk'],
u'zip': u'731678'}

简而言之:在您的蜘蛛中,您必须返回上面的 FormRequest(...),然后在回调中从 response.body 加载 json 对象,最后为列表 data['stores']['listing'] 中每个商店的数据创建一个具有所需值的项目。

类似这样的:

class McDonaldSpider(BaseSpider):
name = "mcdonalds"
allowed_domains = ["mcdonalds.com.sg"]
start_urls = ["https://www.mcdonalds.com.sg/locate-us/"]

def parse(self, response):
# This receives the response from the start url. But we don't do anything with it.
url = 'https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php'
payload = {'action': 'ws_search_store_location', 'store_name':'0', 'store_area':'0', 'store_type':'0'}
return FormRequest(url, formdata=payload, callback=self.parse_stores)

def parse_stores(self, response):
data = json.loads(response.body)
for store in data['stores']['listing']:
yield McDonaldsItem(name=store['name'], address=store['address'])

关于python - Scrapy,在 Javascript 中抓取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19021541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com