【问题标题】:Python post requests - web scrapingPython 发布请求 - 网络抓取
【发布时间】:2020-07-14 11:18:25
【问题描述】:

所以我正在尝试访问一些数据以进行网络抓取。但是,当我要从site 中提取图表时,我被卡住了,我想在下面的代码中编辑观察到的数据时间段。有什么方法可以将这个 sn-p 从 data-timeperiod="today" 活动中提取或更改为 data-timeperiod="week" 吗?

对于一些额外的信息,我尝试访问 chrome 中的网络选项卡以通过发布请求更改此设置,但每次我都被拒绝访问。

<div class="fLeft">
    <ul class="chartsTimeperiod cleanList floatList clearFix buttonPane">
        <li class="active">
                <a href="#" data-timeperiod="today" class="active default">
                    1 d.</a>
            </li>
        <li class="">
                <a href="#" data-timeperiod="week" class="">
                    1 v.</a>
            </li>
        <li class="">
                <a href="#" data-timeperiod="month" class="">
                    1 mån.</a>
            </li>
        <li class="">
                <a href="#" data-timeperiod="three_months" class="">
                    3 mån.</a>
            </li>
        <li class="">
                <a href="#" data-timeperiod="this_year" class="">
                    i år</a>
            </li>
        <li class="">
                <a href="#" data-timeperiod="year" class="">
                    1 år</a>
            </li>
        <li class="last">
                <a href="#" data-timeperiod="three_years" class="">
                    3 år</a>
            </li>
        </ul>
</div>

我可以通过“网络”选项卡看到有一个包含以下数据的请求负载。这是我应该使用它来访问数据还是我走错了路?

{"orderbookId":842107,"chartType":"AREA","widthOfPlotContainer":558,"chartResolution":"MINUTE","navigator":true,"percentage":false,"volume":false,"owners":false,"timePeriod":"week","ta":[],"compareIds":[19002]}

问题 2 - 示例: 基于this

<form method="get" class="forumPagerForm">
        <label for="pageSizeSelect" class="fLeft marginTop5px">Visa antal inlägg:</label> 
        <select id="pageSizeSelect" class="pageSizeSelect">
            <option >15</option>
            <option >25</option>
            <option >50</option>
            <option >75</option>
            <option >100</option>
            <option selected="selected">200</option>
        </select>

        
    </form>

【问题讨论】:

  • 在 Q2:你需要发邮件到avanza.se/forum/user-preferences/posts-per-page 我认为
  • @UWTDTV 你在哪里找到那个网址?
  • 更改值后的第一个请求。 i.ibb.co/Qf7t4jN/post.png
  • @UWTDTV 当我尝试首先获取论坛页面然后执行发布请求时,我收到 500 服务器错误。我可能做错了什么,但试图通过 Postman 进行验证,但到目前为止没有成功。
  • @UWTDTV 可以理解,但我犯了一个小错误,在请求的帖子部分有点新,但现在它可以工作了,谢谢你的时间!

标签: python web-scraping python-requests


【解决方案1】:

试试:

import requests

janson = {
    "orderbookId": '842107',
    "chartType": "AREA",
    "widthOfPlotContainer": '558',
    "chartResolution": "MINUTE",
    "navigator": 'true',
    "percentage": 'false',
    "volume": 'false',
    "owners": 'false',
    "timePeriod": "week",
    "ta": [],
    "compareIds": ['19002']
}
s = requests.Session()
s.get('https://www.avanza.se/aktier/om-aktien.html/842107/gabather')
p = s.post('https://www.avanza.se/ab/component/highstockchart/getchart/orderbook', json=janson)
print(p)

然后从变量 p

中抓取

【讨论】:

  • 哇!这真的做到了!非常感谢!
  • Det va så lite så @Fredrik
  • Om du har tid, får jag ställa en följdfråga? Om jag vill genomföra en post request mot en form som innehåller en select option med 4 alternativ varav den uppdateras när användaren klickar på ett nytt alternativ。 Är det möjligt att skicka en request for att byta option och få sidan att uppdateras?
  • Inte helt säker på vad du menar。 Du vill byta until låt oss säga månad eller år typ?
  • Uppdaterade frågan med ett exempel på data som finns samt en läk om du vill se innehållet också.
【解决方案2】:

您想从图表中获取点数,是吗?如果您将图形分辨率从“周”更改为“月”,并查看网络流量记录器,您可以看到浏览器向https://www.avanza.se/ab/component/highstockchart/getchart/orderbook 发出 HTTP POST 请求。

只需模仿该请求即可。这里,图形分辨率设置为"week",但你应该可以将其更改为"month"等。然后我提出请求并打印前十个点:

def main():

    import requests

    url = "https://www.avanza.se/ab/component/highstockchart/getchart/orderbook"

    data = {
        "chartResolution": "MINUTE",
        "chartType": "AREA",
        "compareIds": [19002],
        "navigator": True,
        "orderbookId": 842107,
        "owners": False,
        "percentage": False,
        "ta": [],
        "timePeriod": "week",
        "volume": False,
        "widthOfPlotContainer": 558
    }

    response = requests.post(url, json=data)
    response.raise_for_status()

    data = response.json()

    for y, x in data["dataPoints"][0:10]:
        print(x, y)

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

输出:

None 1594103400000
8.36 1594105200000
8.4 1594107000000
8.26 1594108800000
8.3 1594110600000
8.42 1594112400000
8.54 1594114200000
8.5 1594116000000
8.52 1594117800000
8.6 1594119600000
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2017-07-25
    • 1970-01-01
    • 2022-01-18
    • 2018-03-22
    • 2016-02-21
    • 2018-08-14
    • 2022-06-23
    相关资源
    最近更新 更多