使用美丽的汤选择 css 选择器

时间:2021-04-20 10:10:23

标签: python html css web-scraping

我正在使用 html 请求和漂亮的汤来开发网络爬虫(我是新手)。对于多个网页,例如(https://www.selfridges.com/GB/en/cat/hermes-rose-herms-silky-blush-6g_R03752945/?previewAttribute=32%20Rose%20Pommette) 我正在尝试获取图像链接,该链接对于多个网页始终相同。 HTML 是:

<img class="c-image-gallery__img" src="//images.selfridges.com/is/image/selfridges/R03752945_32ROSEPOMMETTE_M?$PDP_M_ZOOM$" loading="lazy">

我尝试使用 CSS 选择器:

r = scraper.get(link)
soup = BeautifulSoup(r.content, 'lxml')
imagelink = soup.select('body > section > section.c-product-hero.--multiple-product-shot > div.c-product-hero__product-shots.c-image-gallery > div > picture:nth-child(1) > img')

返回 None

或 find_all:

soup.find_all('img')

但具体链接不在列表中。我不确定这是为什么。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

您尝试抓取的此页面使用 Cloudflare,它具有某种防止被抓取的保护。服务器返回“403 Forbidden”HTTP 状态代码。一些网站使用了大量的 javascript,如果没有支持 javascript 的浏览器,这些网站也很难抓取。我建议您使用不同的技术,例如 Puppeteer

from bs4 import BeautifulSoup
import requests

link = "https://www.selfridges.com/GB/en/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 OPR/75.0.3969.171"}

page = requests.get(link, headers=headers)
print(page.status_code)
print(page.text)

soup = BeautifulSoup(page.text, "lxml")
soup_imgs = soup.find_all("img")
for img in soup_imgs:
    print(img)