【问题标题】:Python BeautifulSoup car rankings scrapingPython BeautifulSoup汽车排名抓取
【发布时间】:2020-04-24 13:52:12
【问题描述】:

我需要从多个网站抓取汽车排名。

例如:

https://www.kbb.com/articles/best-cars/10-best-used-cars-under-10000/

  1. 2011款丰田凯美瑞
  2. 2013款本田思域 ...

https://www.autoguide.com/auto-news/2019/10/top-10-best-cars-for-snow.html

道奇 Charger AWD 斯巴鲁傲虎 日产 Altima AWD ...

我无法检测网站上的排名,因为它们都有点不同。我的目标基本上是在任何给定的汽车网站上拥有一个能够自动检测排名并以相当高的准确度检索我需要的数据(排名中的品牌 + 车型)的脚本。

我想收集的他们的数据(排名中的品牌+车型)有时在 H2、H3 或 H4 中,有时在链接中...... 有时会写成“1. Brand1 Model1, 2. Brand2 Model2...” 有时“Brand1 Model1,Brand2 Model2……” 这取决于...

我正在 Python 中使用 BeautifulSoup 进行此操作。

什么是好的方法?

编辑:

要明确的是,我正在努力分析数据,而不是抓取它(参见下面的 cmets)。 但为了清楚起见,这是我处理上面第一个示例的方式:

for url in urls:
    req = requests.get(url)
    soup = BeautifulSoup(req.text, "lxml")
        

    for sub_heading in soup.find_all('h2'): 
        if  str(1) + ". " in sub_heading.text and "11." not in sub_heading.text: #filter applied to keep only strings starting with "1. "
             list_url.append(url)
             print(list_sub_heading)

结果: ['1。 2011丰田凯美瑞']

【问题讨论】:

  • 如果数据更动态且受 java 脚本控制,那么 selenium 会是更好的选择。
  • 是的,我也在使用请求。需要明确的是,我大部分时间都可以废弃数据。但是我在数据中遇到了麻烦,无法从我收集的所有数据中检测排名。
  • @Sureshmani 听起来很有趣。你能扩大一点吗?
  • @DemianWolf 谢谢,这很酷。话虽如此,我的问题更多的是,开发“始终”有效的解决方案的正确方法是什么。您的解决方案适用于 example1,但不适用于 ex2
  • @user1564140 检查我的以下答案

标签: python web-scraping beautifulsoup


【解决方案1】:
import requests
from bs4 import BeautifulSoup


def main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    goal = [item.find_previous("h3").text for item in soup.findAll(
        "img", class_="alignnone")]
    mylist = list(dict.fromkeys(goal))
    print(mylist)


main("https://www.kbb.com/articles/best-cars/10-best-used-cars-under-10000/")

输出:

['1. 2011 Toyota Camry', '2. 2013 Honda Civic', '3. 2009 Toyota Avalon', '4. 2011 Honda Accord', '5. 2010 Toyota Prius', '6. 2012 Mazda Mazda3', '7. 2011 Toyota Corolla', '8. 2010 Subaru Outback', '9. 2013 Kia Soul', '10. 2012 Subaru Legacy']

re版本:

import requests
import re


def main(url):
    r = requests.get(url)
    match = [f'{item.group(1)} {item.group(2)}'
             for item in re.finditer(r'>(\d+\.).+?>(.+?)<', r.text)]
    print(match)


main("https://www.kbb.com/articles/best-cars/10-best-used-cars-under-10000/")

输出:

['1. 2011 Toyota Camry', '2. 2013 Honda Civic', '3. 2009 Toyota Avalon', '4. 2011 Honda Accord', '5. 2010 Toyota Prius', '6. 2012 Mazda Mazda3', '7. 2011 Toyota Corolla', '8. 2010 Subaru Outback', '9. 2013 Kia Soul', '10. 2012 Subaru Legacy']

【讨论】:

  • 谢谢,这很有趣。但问题是这对一个网站来说是非常具体的。我的问题更多的是正确的方法是什么,因为我正在处理许多不同的网站,我想在其中检索相同的信息(排名中的汽车品牌和型号)
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 2013-09-28
  • 2016-01-01
  • 1970-01-01
  • 2023-01-28
  • 2016-08-08
  • 2018-04-25
  • 2014-06-20
相关资源
最近更新 更多