编程语言
首页 > 编程语言> > python – Scrapy,在Javascript中抓取数据

python – Scrapy,在Javascript中抓取数据

作者:互联网

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

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

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

我想要的属性:
地址,联系方式,营业时间.

如果您在Chrome浏览器中执行“右键单击”,“查看源代码”,您将看到HTML中无法使用此类值.

编辑

Sry paul,我做了你告诉我的事情,找到了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)

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

***项目[‘地址’] = *如何检索****

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

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

我不能强调我的感激之情.我知道问你这个是不合理的,即使你没有时间这个也完全没问题.

解决方法:

(我把它发布到了scrapy-users邮件列表,但保罗建议我在这里发布它,因为它补充了shell命令交互的答案.)

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

对于这种情况,检查(即浏览浏览器发出的请求)显示数据从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对象,最后是列表数据中每个商店的数据[‘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,screen-scraping
来源: https://codeday.me/bug/20190930/1834590.html