繁体   English   中英

使用 Python 设置 web 刮刀时遇到问题

[英]Having trouble setting up a web scraper with Python

三天前我开始学习 Python 创建 web 刮板并收集有关新书发布的信息。 我被困在我的一个目标网站上……我知道这是一个非常基本的问题,但我看过一些视频,查看了许多有关堆栈溢出的相关问题,尝试了 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 错误...

看起来您尝试抓取的源通过 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"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM