使用 BeautifulSoup 从亚马逊抓取整个类别的产品

时间:2021-03-31 08:09:03

标签: python beautifulsoup web-crawler

我为亚马逊编写了一个函数,通过给定一个 URL,它可以为我提供产品的名称、价格和评级。如果我给它一个字符串格式的 URL,这会很好地工作。我想使用这个函数,比如说它叫做 AmazonCrawler,以便从网站上抓取整个产品类别,而不仅仅是单个产品。我该怎么做?

编辑:

这是我想抓取的示例页面:Amazon TV Category。如果我查看页面源代码,我会发现:

<script type='text/javascript'>var ue_t0=ue_t0||+new Date();</script>
<!-- sp:feature:cs-optimization -->
<meta http-equiv='x-dns-prefetch-control' content='on'>
<link rel="dns-prefetch" href="https://images-eu.ssl-images-amazon.com">
<link rel="dns-prefetch" href="https://m.media-amazon.com">
<link rel="dns-prefetch" href="https://completion.amazon.com">
<script type='text/javascript'>
window.ue_ihb = (window.ue_ihb || window.ueinit || 0) + 1;
if (window.ue_ihb === 1) {

我对在亚马逊网站上查找所有智能电视的所有 URL 的方法感兴趣。是否有自动执行此操作的方法?

2 个答案:

答案 0 :(得分:2)

如果您使用谷歌检查器,您会发现图片上的 href 指向您想要的网址。例如,您找到的第一台 Samsum 电视在以下 Xpath 中具有其 href:

/html/body/div[1]/div[2]/div[2]/div[1]/div[3]/div[2]/div[2]/ul/li[1]/span/div/a

enter image description here

从这里你需要找到一种概括搜索的方法

答案 1 :(得分:0)

您需要一个选择器,它以 src 结尾的所有 img 为目标,但还需要排除一些其他早期匹配项。使用 :not 和前面的 .a-row 可以做到这一点。最后,您需要使用 set 来清理独特的项目。

import requests
from bs4 import BeautifulSoup as bs
from pprint import pprint
    
r = requests.get('https://www.amazon.es/b/ref=sv_ap_arrow_ce_4_1_1_1?node=934359031', headers = {'User-Agent':'Mozilla/5.0'})
soup = bs(r.content, 'lxml')
images = set(i['src'] for i in soup.select('.a-row img[src$=jpg]:not(.bxc-grid__row:nth-child(1) img[src$=jpg])'))
pprint(images)