使用 Python 设置网络爬虫时遇到问题

时间:2021-01-12 01:24:59

标签: python web-scraping

三天前,我开始学习 Python 来创建网络爬虫并收集有关新书发行的信息。我被困在我的目标网站之一......我知道这是一个非常基本的问题,但我看过一些视频,看了很多关于堆栈溢出的相关问题,尝试了 10 多种不同的解决方案,但一无所获。如果有人可以提供帮助,非常感谢:

我的问题: 我可以检索标题信息但无法检索价格信息

数据来源: https://www.bloomsbury.com/uk/non-fiction/business-and-management/?pagesize=25

我的代码:

from bs4 import BeautifulSoup
import requests
import csv

url = 'https://www.bloomsbury.com/uk/non-fiction/business-and-management/?pagesize=25'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
source = requests.get(url, headers=headers).text

#获取标题的代码

soup = BeautifulSoup(source, 'lxml')
for productdetails in soup.find_all("div", class_='figDetails'):
    producttitle = productdetails.a.text
    print(producttitle)

#获取价格的代码

for productpricedetails in soup.find_all("div", class_='related-products-block'):
    productprice = productdetails.find("div", class_="new-price").span.text
    print(productprice)

有两个元素的名称为 span,我需要有关第二个的信息,但不知道如何获取。 此外,在尝试不同的可能解决方案时,我不断收到 noneType 错误...

1 个答案:

答案 0 :(得分:0)

看起来您尝试抓取的源是通过 Javascript 填充此数据的。

查看页面的源代码,您可以看到原始 HTML 显示您尝试定位的 div 为空。

<html>   
... 
    <div class="related-products-block" id="reletedProduct_490420">
    </div>
...
</html>

如果您像这样更新第二个循环,您也可以看到这一点:

for productpricedetails in soup.find_all("div", class_="related-products-block"):
    print(productpricedetails)

编辑

作为奖励,您可以检查页面使用的 Javascript。它很容易理解,请求只返回您要查找的 HTML。为请求准备 JSON 会更复杂一些,但这里有一个例子:

import requests

url = "https://www.bloomsbury.com/uk/catalog/RelatedProductsData"

payload = {"productId": 490420, "type": "List", "ordertype": 0, "formatType": 0}
headers = {"Content-Type": "application/json"}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text.encode("utf8"))
相关问题