【问题标题】:I need to web scraping data from a website that uses frames我需要从使用框架的网站上抓取数据
【发布时间】:2020-07-07 20:27:37
【问题描述】:

拜托,我希望你给我一些关于项目的方向,因为我迷路了,真的不知道从哪里开始。

我是 Python 的新手,但我已经编写了一个网页抓取脚本来从一些网站获取一些信息,使用 lxml 和 xpath 通过 HTML DOM 获取数据。

但现在,客户向我提出了挑战……

这个网站正在使用我必须获取数据的框架=(我不知道如何处理......

更复杂的是,该网站需要登录:(

如果有人可以帮助我提供一些信息,比如我必须从哪里开始?

是否可以从将数据显示到框架中的网站获取数据?

这是网址:https://www.bulkshared.com/online-ordering

我想将脚本指向“Pantry”部分,但 url 不显示路径 =(

你推荐我哪种脚本?我想使用 Python,但我必须使用 BS 吗? Xpath?硒?

有人可以捐出你的一小部分时间来帮助我吗?

非常感谢你们的时间,伙计们!

【问题讨论】:

  • Pantry 部分在哪里?你忘了告诉那个网站需要登录!
  • 是的,对不起...我忘了...如果网站需要登录,是否可以执行网页抓取脚本?
  • 所以你想抓取标题、描述和价格,是吗?
  • 是的,哥们...关键是我不知道如何将脚本指向正确的方向,因为网站没有显示 url 地址...就像你记得的那样我...该网站需要登录 :( 你认为最好的方法是使用 Selenium 吗?
  • 欢迎您。很高兴为您提供帮助

标签: python web xpath web-scraping beautifulsoup


【解决方案1】:
import requests
from bs4 import BeautifulSoup
import re
import csv


def Login(url):
    with requests.Session() as req:
        r = req.get(url)
        soup = BeautifulSoup(r.content, 'html.parser')
        script = soup.find("script", type="text/javascript").text
        collectionId = re.search("collectionId\":\"(.*?)\"", script).group(1)
        metaSiteId = re.search("metaSiteId\":\"(.*?)\"", script).group(1)
        svSession = re.search("svSession\":\"(.*?)\"", script).group(1)
        data = {
            'email': 'test@test.com',
            'password': 'test123',
            'collectionId': collectionId,
            'metaSiteId': metaSiteId,
            'appUrl': 'https://www.bulkshared.com/online-ordering',
            'svSession': svSession
        }
        r = req.post(
            "https://www.bulkshared.com/_api/wix-sm-webapp/member/login", data=data)
        r = req.get(
            "https://api.wixrestaurants.com/v2/organizations/5716166580714419/full").json()
        return r


def Sorter():
    data = Login("https://www.bulkshared.com/")
    with open("result.csv", 'w', newline="", encoding="UTF-8") as f:
        writer = csv.writer(f)
        writer.writerow(["Name", "Price"])
        for item in data["menu"]["items"]:
            title = item["title"]["en_AU"]
            try:
                price = item["price"]
            except:
                price = "N/A"
            try:
                description = item["description"]["en_AU"].strip()
            except:
                description = "N/A"
            writer.writerow([title, description, price])


Sorter()

注意:写完代码后,我发现API 是完全公开的,不需要传递任何登录会话信息。

所以你可以直接调用它。

import requests
import json

r = requests.get(
    "https://api.wixrestaurants.com/v2/organizations/5716166580714419/full").json()

print(json.dumps(r, indent=4))

【讨论】:

  • 太棒了!所以我可以使用这个 JSON 结果
  • 有人可以帮我吗?我有 wix 网络应用程序。我正在尝试将其在线程序集成到我的自定义应用程序中,但发现了一些困难。我注意到当我请求加入该程序时,会打开一个带有注册和登录表单的弹出窗口。登录后设置cookies。我得到了登录 API,但如果我从后端调用它,那么没有任何 cookie 集。我也没有找到任何注销 API。有人可以帮我解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多