首页 > 解决方案 > soup.find(class_="") 不适用于加密站点

问题描述

我正在尝试刮Ksl。由于他们的网站是加密的,我必须使用 Mozilla 来正常抓取它。这是我到目前为止所拥有的

import urllib.request
import bs4 as bs

class AppURLopener(urllib.request.FancyURLopener):
version = "Mozilla/5.0"

opener = AppURLopener()
sauce = opener.open("https://classifieds.ksl.com/search?category[]=&subCategory[]=&keyword=piano&priceFrom=&priceTo=&zip=&miles=25&sellerType[]=&marketType[]=Sale&hasPhotos[]=&postedTime[]=").read()
soup = bs.BeautifulSoup(sauce, 'lxml')
print(soup.find(class_="listing-item"))

当我按类搜索soup.find(class_="") 时没有任何反应,但是当我使用类似的东西时,soup.find(id="")soup.find("div")工作得很好。

我过去使用过 beautifulsoup,与我过去编写的代码相比,这段代码唯一不同的是 Ksl 的网络加密。

如果有人有解决方案,那将不胜感激。

标签: pythonweb-scrapingbeautifulsoup

解决方案


如果您不使用任何浏览器模拟器,则需要使用标题来访问该页面的内容。此外,您感兴趣的内容是 javascript 加密的。但是,所需内容在该页面的某些脚本标记中可用,因此您可以使用requests模块以及rehjson来获取它们。如果您urllib不想使用requests.

import re
import hjson
import requests

url = "https://classifieds.ksl.com/search?category[]=&subCategory[]=&keyword=piano&priceFrom=&priceTo=&zip=&miles=25&sellerType[]=&marketType[]=Sale&hasPhotos[]=&postedTime[]="

res = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
items = hjson.loads(re.findall(r"window.renderSearchSection\(([\s\S]*?)\)</",res.text)[0])
for item in items['listings']:
    name = item['title']
    price = item['price']
    print(name,price)

输出部分如下:

PIANO TUNER GOING OUT OF BUSINESS 1
Brodmann PE-187 Grand Piano 12500
Player piano 250
Antique Claw Foot Piano Stool (Doesn't Spin) 60
Free Player Piano 0
Baldwin Studio Piano with Bench and Music Books 375
Excellent condition  Brodmann electric piano 200
Casio Privia px-760 Piano/Keyboard 500

推荐阅读