【问题标题】:Need help reducing execution time for scraping dynamic content需要帮助减少抓取动态内容的执行时间
【发布时间】:2023-03-04 18:59:01
【问题描述】:

我目前正在使用 Selenium (chrome) 从网站上抓取动态内容,但自动浏览器的处理时间过长。 (我正在抓取的个人资料页面上有一个“查看更多”按钮,每次点击它只加载 5 个帖子)没有其他方法可以访问这些“隐藏”帖子而不点击“查看更多”按钮,它手动单击按钮以检索不久前的帖子需要太长时间。关于如何加快这个过程的任何想法?

网址:https://r1.community.samsung.com/t5/user/viewprofilepage/user-id/5045

【问题讨论】:

  • 如果页面有 API 然后使用它。如果你可以在没有 Seleniu 的情况下重写它。如果您必须使用 Selenium,请使用选项 --headless 运行 - 它将在不显示窗口的情况下运行,并且不需要在屏幕上呈现所有内容。
  • 在不知道 URL 的情况下很难看出如何加快速度。查看页面发出请求的开发人员工具,注意 URL,也许您可​​以直接查询这些 URL。
  • @AndrejKesely 抱歉,我刚刚添加了网址。 r1.community.samsung.com/t5/user/viewprofilepage/user-id/5045

标签: javascript python selenium-webdriver web-scraping beautifulsoup


【解决方案1】:

查看页面,有接受offsetlimit 参数的URL。有了这个,您可以一次收到许多消息。您可以将其放入循环中,增加offset 参数并获取所有没有硒的消息:

    from bs4 import BeautifulSoup
    import requests

    url = 'https://r1.community.samsung.com/t5/user/viewprofilepage/user-id/5045'

    user_id = url.split('/')[-1]
    posts_url = 'https://r1.community.samsung.com/plugins/custom/samsung/samsungelamer2/custom.profile-activity?type=posts&offset={}&limit={}&currentUser={}'

    offset = 0
    limit = 100

    soup = BeautifulSoup(requests.get(posts_url.format(offset, limit, user_id)).text, 'lxml')

    for i, (subject, message_body) in enumerate(zip(soup.select('.message-subject'), soup.select('.lia-message-body-content')), 1):
        print('Message {}'.format(i))
        print('Subject:\n', subject.text.strip())
        print('Message body:\n', message_body.text.strip())
        print('*' * 120)

打印:

    Message 1
    Subject:
     안드로이드 Q Beta 프리뷰 5 새로운 제스쳐
    Message body:
     안드로이드 Q O ...

    ...and so on.

【讨论】:

  • 哇哦!非常感谢,为我节省了很多时间!这只是抓取其他内容的后续问题,但是,有哪些方法可以在不从每个 url 请求内容的情况下抓取多个页面(例如 some_url_/page/1、some_url/page/2 等)?
  • @Joonie 不请求内容?你需要有一些东西可以抓取,所以对每个 URL 的请求是必要的(除非所有内容都已经存在于页面中,而在大多数情况下不存在)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多