【问题标题】:Unable to scrape specific ‘span’ tag from website by using python library ‘Beautiful soup’无法使用 python 库“Beautiful soup”从网站上抓取特定的“span”标签
【发布时间】:2019-12-13 01:27:41
【问题描述】:

我正在做一个数据分析项目,并试图从网站 'turo.com' 获取数据;无法从特定“div”标签下的特定“span”标签中抓取数据。以下是代码:

from requests import get
url = "https://turo.com/en-us/search?country=US&defaultZoomLevel=13&delivery=false&deliveryLocationType=googlePlace&endDate=12%2F17%2F2019&endTime=10%3A00&international=true&isMapSearch=false&itemsPerPage=200&latitude=34.0929744&location=Alhambra%20High%20School%2C%20South%202nd%20Street%2C%20Alhambra%2C%20CA%2C%20USA&locationType=Address&longitude=-118.1284232&maximumDistanceInMiles=50&placeId=ChIJsZLFwSbFwoARDVnxkdATxS0&region=CA&sortType=RELEVANCE&startDate=12%2F14%2F2019&startTime=10%3A00"
response = get(url)

from bs4 import BeautifulSoup
html_soup = BeautifulSoup(response.text, "html.parser")

carName = html_soup.find(class_ = "vehicleCard-makeModel")
carYear = html_soup.find(class_ = "vehicleCard-year")
carTrip = html_soup.find(class_ = "vehicleRatingAndTrips-trips")
carAllStart = html_soup.find(class_ = "allStarHostBadge-icon")
#JoinTime = html_soup.find(class_ = "media-body hostDetailCard-info")

# carStart = html_soup.find(class_ = "starRating vehicleWithDetailsInfo-attribute vehicleWithDetailsInfo-attribute--starRating")
#print(carName.text, carYear.text)
#print(carTrip.text)# print(carStart.)
#print(carAllStart.text)
#print(JoinTime.div.text[: -14])

print(carName)
print(carYear)
print(carTrip)
print(carAllStart)
#print(JoinTime)

结果如下:

None
None
None
None

【问题讨论】:

  • 您是否尝试查看请求返回的实际 HTML?这才是最重要的。

标签: python html web-scraping beautifulsoup


【解决方案1】:

当我在我选择的浏览器中加载它时,您使用的类名与我在页面上看到的不匹配。更重要的是,内容是动态加载的,所以页面上没有最初提供的信息框,所以不能简单地请求页面并抓取信息;您必须使用无头浏览器。继续检查页面响应以确认。祝你好运。

【讨论】:

  • 感谢您的热心回复; 'span' 标签位于
    /
  • carTrip 在 49 次行程,谢谢您的指正。
  • @Alan.Tan 我可以确认 pkfm 所说的。我刚刚检查了 HTML 源代码,您共享的标签没有任何内容。
  • @Alan.Tan 可能该站点根据随请求发送的标头提供不同版本的自身。这并不少见。
  • pkfm 和 Alexander écile ;非常感谢你们俩收集我,正确地,我之前发布的标签与我正在寻找的前一个“url”相对应。但即使我更新了新标签,它仍然打印出'none',我已经尝试了很多次,所以我会尝试你的建议使用无头浏览器。但是如果页面是 javascript 重的网站,那会是一个问题,所以我应该使用另一个库吗??
【解决方案2】:

数据是从刷新页面时在网络选项卡中找到的 API 调用动态检索的。传递适当的参数和标题,然后处理 json 响应。

import requests

headers = {
    'referer': 'https://turo.com/en-us/search?country=US&defaultZoomLevel=13&delivery=false&deliveryLocationType=googlePlace&endDate=12/23/2019&endTime=11:00&international=true&isMapSearch=false&itemsPerPage=200&latitude=34.0929744&location=Alhambra High School, South 2nd Street, Alhambra, CA, USA&locationType=Address&longitude=-118.1284232&maximumDistanceInMiles=50&placeId=ChIJsZLFwSbFwoARDVnxkdATxS0&region=CA&sortType=RELEVANCE&startDate=12/23/2019&startTime=10:00',
}

params = (
    ('country', 'US'),
    ('defaultZoomLevel', '13'),
    ('delivery', 'false'),
    ('deliveryLocationType', 'googlePlace'),
    ('endDate', '12/23/2019'),
    ('endTime', '11:00'),
    ('international', 'true'),
    ('isMapSearch', 'false'),
    ('itemsPerPage', '200'),
    ('latitude', '34.0929744'),
    ('location', 'Alhambra High School, South 2nd Street, Alhambra, CA, USA'),
    ('locationType', 'Address'),
    ('longitude', '-118.1284232'),
    ('maximumDistanceInMiles', '50'),
    ('placeId', 'ChIJsZLFwSbFwoARDVnxkdATxS0'),
    ('region', 'CA'),
    ('sortType', 'RELEVANCE'),
    ('startDate', '12/23/2019'),
    ('startTime', '10:00'),
)

r = requests.get('https://turo.com/api/search', headers = headers, params=params)
data = r.json()
listings = data['list']

for listing in listings:
    car_name = ' '.join([listing['vehicle']['make'], listing['vehicle']['model']])
    car_year = listing['vehicle']['year']
    car_trip = listing['renterTripsTaken']
    car_allstar = listing['owner']['allStarHost']
    print([car_name, car_year, car_trip, car_allstar]), car_trip, car_allstar])

【讨论】:

  • 干得好,非常感谢;但是为什么即使我更改了参数和 URL 中的 itemsPerPage 数据,我也只能检索到 200 个项目?如何在 Jason 响应中应用循环概念以获得更多数据?
  • 你怎么知道还有更多数据?
  • 无论我改变多少次'time'、'maximumDistanceInMiles'和'itemsPerPage',结果总是显示200个项目。我怎样才能刮掉特定英里内特定区域中列出的汽车总数?
  • 我建议考虑接受这个答案并提出一个新问题。在该问题中说明您想要所有项目,并确保这是一个可以证明有 200 多个项目的示例。说明您已尝试更改查询字符串中的参数无济于事 - 结果始终是最大 200(如果您请求
猜你喜欢
相关资源
最近更新 更多
热门标签