当前位置: 首页 > 知识库问答 >
问题:

在点击按钮后获得信息的网页上抓取

赏新知
2023-03-14

  1. "在点击'5更多属性'之前:第一张图片显示了4个div,其中包含我可以使用上述任何方法获得的"span"。
  2. 点击'5更多属性'后:第二张图片显示9 div,其中包含我试图到达的"span"。

下面是使用硒/美汤的代码

import selenium
from selenium import webdriver
from bs4 import BeautifulSoup

URL ='https://www.yelp.com/biz/ziggis-coffee-longmont'

driver = 
 webdriver.Chrome(r"C:\Users\Fariha\AppData\Local\Programs\chromedriver_win32\chromedriver.exe")
driver.get(URL)
yelp_page_source_page1 = driver.page_source



soup = BeautifulSoup(yelp_page_source_page1,'html.parser')
spans = soup.find_all('span')

结果:“跨度”中有990个元素。我只是展示与我的问题相关的东西:

共有1个答案

越学义
2023-03-14

另一种方法是直接从网站上的JSON api中提取数据。这可以在没有硒的开销的情况下完成,如下所示:

from bs4 import BeautifulSoup
import requests
import json

session = requests.Session()
r = session.get('https://www.yelp.com/biz/ziggis-coffee-longmont')
#r = session.get('https://www.yelp.com/biz/menchies-frozen-yogurt-lafayette')

soup = BeautifulSoup(r.content, 'lxml')

# Locate the business ID to use (from JSON inside one of the script entries)
for script in soup.find_all('script', attrs={"type" : "application/json"}):
    gaConfig = json.loads(script.text.strip('<!-->'))

    try:
        biz_id = gaConfig['gaConfig']['dimensions']['www']['business_id'][1]
        break
    except KeyError:
        pass

# Build a suitable JSON request for the required information
json_post = [
    {
        "operationName": "GetBusinessAttributes",
        "variables": {
            "BizEncId": biz_id
        },
        "extensions": {
            "documentId": "35e0950cee1029aa00eef5180adb55af33a0217c64f379d778083eb4d1c805e7"
        }
    },
    {
        "operationName": "GetBizPageProperties",
        "variables": {
            "BizEncId": biz_id
        },
        "extensions": {
            "documentId": "f06d155f02e55e7aadb01d6469e34d4bad301f14b6e0eba92a31e635694ebc21"
        }
    },
]

r = session.post('https://www.yelp.com/gql/batch', json=json_post)
j = r.json()

business = j[0]['data']['business']
print(business['name'], '\n')

for property in j[1]['data']['business']['organizedProperties'][0]['properties']:
    print(f'{"Yes" if property["isActive"] else "No":5} {property["displayText"]}')

这将为您提供以下条目:

Ziggi's Coffee 

Yes   Offers Delivery
Yes   Offers Takeout
Yes   Accepts Credit Cards
Yes   Private Lot Parking
Yes   Bike Parking
Yes   Drive-Thru
No    No Outdoor Seating
No    No Wi-Fi

这是怎么解决的?

这里你最好的朋友是你浏览器的网络开发工具。有了这个,你可以观看获取信息的请求。正常的处理流程是初始超文本标记语言页面被下载,这运行javascript并请求更多的数据来进一步填充页面。

诀窍是首先定位您想要的数据所在的位置(通常以JSON的形式返回),然后确定重新创建请求所需的参数所需的内容。

要进一步理解此代码,请使用print()。打印所有内容,它将显示每个部分如何构建在下一个部分上。剧本就是这样写的,一次一点。

使用Selenium的方法允许javascript工作,但大多数情况下这并不需要,因为它只是发出请求并格式化数据以供显示。

 类似资料:
  • 我正在使用javascript(extensions chrome)在程序“Atom”中制作一个机器人,并希望点击按钮“添加到购物车”。我的html是。我猜我在使用值时需要这样做。怎么做?

  • 要获取当前选定行的行信息,可以执行以下操作 但如何获得相同的,当我点击编辑按钮? 我尝试了它没有工作。 编辑 我尝试了下面答案中建议的方法,但它仍然给我空值 完整代码

  • 问题内容: 我需要自动单击网页中的任何“添加”按钮,如下所示: “ https://groceries.asda.com/search/yoghurt ” 但是,页面中的“添加”按钮都没有名称或ID。所以我不能使用Selenium包中的命令。 谁能帮我? 问题答案: 要单击特定产品的任何特定按钮,可以编写如下方法: 现在,您可以单击传递其标题的任何按钮,如下所示:

  • 我一直在尝试使用selenium完成输入框,但在单击添加新客户按钮后总是找不到该输入框,它总是显示一个空白的白页。我通过chrome和fire fox@Test public val AddTouch()抛出中断异常{

  • 不含硒 我需要点击一个网页上的按钮。有可能与请求有关吗?我不想用硒。 提前道谢!

  • 我正在尝试从政府网站自动下载表单数月的过程。它要求我登录到我的帐户,然后单击一些按钮继续。出于某种原因,我不想使用IE自动化,因此,我选择通过Excel VBA使用硒来自动化Chrome。我可以登录,但是,登录后我无法单击按钮。到目前为止,我的VBA代码如下 - 在此之后,我想单击一个按钮,该按钮的HTML是 请注意,还有其他按钮具有相同的类。请指导我如何单击此按钮?