【问题标题】:Script fails to extract certain fields from a webpage using requests脚本无法使用请求从网页中提取某些字段
【发布时间】:2021-05-07 15:45:36
【问题描述】:

我正在尝试从这个webpage 中抓取title、website 和email。那里提供的内容非常动态。尽管requests 模块无法处理 javascript 繁重的内容,但总是有替代方法可以使用库获取相同的内容,就像使用从开发工具检索到的任何外部链接一样。但是,我就是找不到正确的方法。

我试过了:

import requests
from bs4 import BeautifulSoup

link = 'https://www.firmy.cz/detail/13153157-azajola-stare-mesto-nova-seninka.html'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    res = s.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    title = soup.select_one("h1").text
    website = soup.select_one("a.companyUrl").text
    email = soup.select_one("a.companyMail").text
    print(title,website,email)

当我运行上面的脚本时,它会抛出AttributeError。

我追求的输出:

AZAJOLA, s.r.o., www.chatanovaseninka.cz, info@chatanovaseninka.cz

PS 我不想使用 selenium 之类的浏览器模拟器。

【问题讨论】:

    标签: python python-3.x web-scraping python-requests


    【解决方案1】:

    该站点使用FastRPC 协议(额外使用Base64 编码)。您可以从https://pypi.org/project/pyfrpc/ 安装PyFRPC 模块来编码/解码消息:

    import re
    import pyfrpc  # <-- install from https://pypi.org/project/pyfrpc/
    import base64
    from pprint import pprint
    
    url = (
        "https://www.firmy.cz/detail/13153157-azajola-stare-mesto-nova-seninka.html"
    )
    api_url = "https://www.firmy.cz/RPC2/"
    id_ = int(re.search(r"detail/(\d+)", url).group(1))
    
    headers = {
        "Accept": "application/x-base64-frpc",
        "Content-Type": "application/x-base64-frpc",
    }
    c = pyfrpc.FrpcCall(
        name="system.multicall",
        args=[
            [
                {
                    "methodName": "detail.getDetail",
                    "params": [
                        {"version": "1.0"},
                        id_,
                        {"searchInCategory": False, "deliveryNetwork": ""},
                    ],
                },
                {
                    "methodName": "review.listReviews",
                    "params": [{"version": "1.0"}, id_, 0, 3],
                },
            ]
        ],
    )
    msg_to_send = base64.b64encode(pyfrpc.encode(c, 0x0201))
    
    r = requests.post(api_url, headers=headers, data=msg_to_send)
    response = pyfrpc.decode(base64.b64decode(r.text))
    
    # uncomment to see all data:
    # pprint(response.data)
    
    print(response.data[0]["result"]["title_web"])
    print(response.data[0]["result"]["email"])
    print(response.data[0]["result"]["url"].split("#")[0])
    

    打印:

    AZAJOLA, s.r.o.
    info@chatanovaseninka.cz
    http://www.chatanovaseninka.cz
    

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多