【问题标题】:Scraping information from a website with a 'Show More' button使用“显示更多”按钮从网站上抓取信息
【发布时间】:2019-09-16 09:31:33
【问题描述】:

我正在尝试从这个网站上抓取有关连衣裙的信息:https://www.libertylondon.com/uk/department/women/clothing/dresses/

显然,我不仅对前 60 个结果感兴趣,而且对所有结果都感兴趣。当点击“显示更多”按钮几次时,我到达了这个网址:https://www.libertylondon.com/uk/department/women/clothing/dresses/#sz=60&start=300

我原以为使用下面的代码可以完整下载上述页面,但由于某种原因,它仍然只会产生前 60 个结果。

import requests
import bs4

url = "https://www.libertylondon.com/uk/department/women/clothing/dresses/#sz=60&start=300"

res = requests.get(url)
res.encoding = 'utf-8'
res.raise_for_status()
html = res.text

soup = bs4.BeautifulSoup(html, "lxml")
elements = soup.find_all("div", attrs = {"class": "product product-tile"})

我可以看到问题在于请求本身,因为soup 变量不包含我在检查页面时看到的完整 html 文本,但我不知道为什么会这样。

【问题讨论】:

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


    【解决方案1】:

    试试下面的 url 获取 331 个元素。

    网址:https://www.libertylondon.com/uk/department/women/clothing/dresses/?sz=331&start=0&format=ajax

    import requests
    import bs4
    
    url="https://www.libertylondon.com/uk/department/women/clothing/dresses/?sz=331&start=0&format=ajax"
    res = requests.get(url)
    res.encoding = 'utf-8'
    res.raise_for_status()
    html = res.text
    
    soup = bs4.BeautifulSoup(html, "lxml")
    elements = soup.find_all("div", attrs = {"class": "product product-tile"})
    print(len(elements))
    

    【讨论】:

      【解决方案2】:

      点击“显示更多”按钮后显示的链接使用片段(注意# 符号)。这不是发送到服务器的东西,而是前端的 JavaScript 使用它来加载更多项目而无需重新加载整个页面。

      但是,您很幸运,因为如果您查看浏览器控制台中发出的 HTTP 请求,您会看到它向https://www.libertylondon.com/uk/department/women/clothing/dresses/?sz=60&start=60 发出请求。这些是查询参数(并且似乎与片段完全匹配!),因此这意味着服务器将发送额外的项目。

      【讨论】:

      • 谢谢,这也可以通过发送具有不同起始值的多个请求并合并结果来实现!
      • 附带说明,如果你想编写一个可靠/可维护的爬虫,可以跟踪页面等,你应该看看Scrapy。它works with BeautifulSoup,这样你就可以保留你的解析逻辑。
      【解决方案3】:

      我认为在这种情况下,按钮“显示更多”,从*from* th 连衣裙加载*sz* 连衣裙。

      所以当你使用#sz=60&start=300属性进行http请求时,数据库只会获取索引300到360的连衣裙,这就是为什么请求只包含60条连衣裙的原因。

      页面上有另一个按钮指示另一个 url:SHOW ALL,这个按钮给出这个 url:https://www.libertylondon.com/uk/department/women/clothing/dresses/?sz=120

      仅使用?sz=120 url 参数,您可以获得sz 连衣裙数量的答案。但似乎一次可以加载多少件衣服是有限制的。

      【讨论】:

        【解决方案4】:

        HTTP GET to https://www.libertylondon.com/uk/department/women/clothing/dresses/#sz=331&start=0 将返回所有项目(331 是当前项目数,将来可能会更改)

        【讨论】:

          猜你喜欢
          • 2021-07-26
          • 2015-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多