用“显示更多”按钮从网站上抓取信息

2024-10-04 03:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从这个网站上搜集裙子的信息: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文本,但我不明白这是为什么。你知道吗


Tags: httpscomhtmlwwwresstart感兴趣department
3条回答

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

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

试试下面的网址,它可以给你331个元素。你知道吗

url : 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))

我认为在这种情况下,按钮“显示更多”,从第*from*条裙子加载*sz*条裙子。你知道吗

因此,当您使用#sz=60&start=300属性执行http请求时,数据库将只获取索引300到360之间的地址,这就是为什么请求只包含60个地址的原因。你知道吗

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

只需使用?sz=120url参数,就可以得到sz个连衣裙的答案。但你一次能装多少件衣服似乎是有限制的。你知道吗

相关问题 更多 >