【问题标题】:python web scraping of a dynamically loading pagepython web抓取动态加载页面
【发布时间】:2014-04-04 12:14:35
【问题描述】:

假设我想抓取这个页面:https://twitter.com/nfl

from bs4 import BeautifulSoup
import requests

page = 'https://twitter.com/nfl'
r = requests.get(page)
soup = BeautifulSoup(r.text)
print soup 

我在页面上向下滚动的次数越多,显示的结果就越多。但是上面的这个请求只给了我初始负载。如何像手动向下滚动一样获取页面的所有信息?

【问题讨论】:

  • 你好,我和你的情况类似,我的建议是学习一点js(这就是我现在正在做的)。您实际上可以使用适当的参数调用js文件,使其直接将数据输出到文件(最有可能是json)。但由于我现在正在学习它,我无法提供更好的解决方案。如果我错了,请纠正我。我正在处理的案例是 stocktwits.com/symbol/aapl 。我希望它会给你一点。

标签: python twitter web-scraping beautifulsoup


【解决方案1】:

首先从html源解析data-max-id="451819302057164799"值。

然后使用 id 451819302057164799 构造一个如下所示的 url:

https://twitter.com/i/profiles/show/nfl/timeline?include_available_features=1&include_entities=1&max_id=451819302057164799

现在获取链接的 html 源并使用 simplejson 或任何其他 json 库进行解析。

请记住,下一页加载(向下滚动时)可从该 json 中的值 "max_id":"451369755908530175" 获得。

【讨论】:

  • https://twitter.com/i/profiles/show/nfl/timeline?include_available_features=1&include_entities=1&max_id=451819302057164799 这是适用于所有 Twitter 页面的通用解决方案吗?你怎么知道如何构造那个特定的 url?
  • @jason_cant_code 可以。我没有检查。可能nfl 是不同页面的键。
  • 我认为这行不通。我的页面比预期的要短得多。
  • 使用请求会话确保您在每次 GET 中保持会话状态
【解决方案2】:

更好的解决方案是使用Twitter API

有几个python twitter API客户端,例如:

【讨论】:

  • 好建议。如果没有好的通用解决方案,我可能会试一试。
  • @jason_cant_code 好吧,如果您需要来自 twitter 的数据,这绝对是您的选择。
  • 如果您可以使用 API,那么肯定会忘记抓取。这是您的解决方案。
【解决方案3】:

如果内容是用javascript动态添加的,你最好的机会是使用selenium来控制像phantomjs这样的无头浏览器,使用selenium webdriver模拟向下滚动,添加等待新内容加载,然后才提取 html 并将其提供给您的 BS 解析器。

【讨论】:

  • 如果没有更好的解决方案我会试试这个
  • 是的,Selenium 始终是一种选择……但 IMO 并不是最好的选择。我更喜欢计算浏览器和服务器之间的 http 流量,并使用请求、urllib 或其他任何东西来模拟它......比 Selenium 快得多。
【解决方案4】:

对于动态生成的内容,数据通常为 json 格式。因此,我们必须检查页面,转到网络选项并找到链接,该链接将为我们提供即时数据/响应。 例如:页面-https://techolution.app.param.ai/jobs/数据是动态生成的。为此我得到了这个链接 - https://techolution.app.param.ai/api/career/get_job/?query=&locations=&category=&job_types=

之后,网络抓取变得有点容易,我在 python 中使用 Anaconda Navigator 完成了这项工作。这是 github 链接 - https://github.com/piperaprince01/Webscraping_python/blob/master/WebScraping.ipynb

如果您可以进行任何更改以使其更好,请随意这样做。 谢谢。

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2018-01-18
    • 2017-07-24
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2021-06-25
    相关资源
    最近更新 更多