【问题标题】:Having trouble setting up a web scraper with Python使用 Python 设置网络爬虫时遇到问题
【发布时间】:2021-01-12 01:24:59
【问题描述】:

三天前,我开始学习 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 错误...

【问题讨论】:

    标签: python web-scraping


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回答!我知道这可能很清楚,但我仍然不明白我应该做什么......
    • 我明白你所说的 div 是空的。我的错误是我在网络浏览器中检查以检查 div,吸取了教训。我仍然不知道我应该更改代码的哪些部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2021-09-11
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多