【问题标题】:My first scrapy xpath selector我的第一个 scrapy xpath 选择器
【发布时间】:2014-08-24 20:26:45
【问题描述】:

我对此很陌生,并且一直在尝试了解我的第一个选择器。有人可以帮助我吗?我正在尝试从此页面中提取数据:

http://groceries.asda.com/asda-webstore/landing/home.shtml?cmpid=ahc--ghs-d1--asdacom-dsk-_-hp#/shelf/1215337195041/1/so_false

div class= Listing clearfix ShelfListing 下的所有信息,但我似乎无法弄清楚如何格式化 response.xpath()

我已经成功启动了scrapy 控制台,但是无论我在response.xpath() 中输入什么,我似乎都无法选择正确的节点。我知道它有效,因为当我输入时

>>>response.xpath('//div[@class="container"]')

我收到了回复。然而,我不知道如何导航到清单 cleardix 货架清单。我希望一旦我得到这一点,我就可以继续通过蜘蛛工作。

PS 我想知道是否无法扫描此站点 - 所有者可以阻止蜘蛛吗?

【问题讨论】:

    标签: python xpath web-scraping scrapy scrapy-spider


    【解决方案1】:

    divlistings 类(和 id)中的内容通过 XHR 请求异步加载。也就是说Scrapy得到的html代码中不包含它:

    $ scrapy shell http://groceries.asda.com/asda-webstore/landing/home.shtml?cmpid=ahc--ghs-d1--asdacom-dsk-_-hp#/shelf/1215337195041/1/so_false
    >>> response.xpath('//div[@id="listings"]')
    []
    

    使用浏览器开发者工具,你可以看到请求到http://groceries.asda.com/api/items/viewitemlist url,带有一堆GET参数。

    一种选择是模拟该请求并解析生成的 JSON:

    如何做到这一点实际上是另一个问题的一部分。


    这是使用selenium 包的一种可能解决方案:

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('http://groceries.asda.com/asda-webstore/landing/home.shtml?cmpid=ahc--ghs-d1--asdacom-dsk-_-hp#/shelf/1215337195041/1/so_false')
    
    div = driver.find_element_by_id('listings')
    for item in driver.find_elements_by_xpath('//div[@id="listings"]//a[@title]'):
        print item.text.strip()
    
    driver.close()
    

    打印:

    Kellogg's Coco Pops
    Kelloggs Rice Krispies
    Kellogg's Coco Pops Croco Copters
    ...
    

    【讨论】:

    • 嗨,Alecxe,非常感谢您解决这个问题。我以为我正在尝试使用 X 路径变体。所以你的建议是使用一些实际缓存页面的工具,然后从中提取数据?你有什么想法吗?再次感谢。
    • @JaspalSinghRathour 好吧,是的,另一种选择是使用像selenium 这样的工具来启动真正的浏览器,基本上为您提供所见即所得。您可以在这里使用真正的浏览器吗?
    • 我想这是一种方法。看看我是否可以导出源代码,然后运行搜索标签或正则表达式的脚本。最终我想自动化查询以每天运行并填充一个 sql 数据库,但我想我离那个还有几步之遥:)
    • @JaspalSinghRathour 所以,我建议两种方法:第一种,首选的方法 - 在 python 中模拟 get 请求(例如,使用 requests 模块)并解析来自 json 响应的数据。另一种是使用selenium 并从HTML 源代码中提取数据。选择一个,我会尽力为您提供解决方案。
    • 嗨,alecxe,我非常想选择选项 1,因为这似乎是两者中最流畅的。我不是 python 专家,但会对正确的指针感到高兴。如您所知,目标是从页面中提取产品信息并输入到 json 或 csv 中,这样就可以将其插入到数据库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多