python - 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 的网络加密。
如果有人有解决方案,那将不胜感激。
解决方案
如果您不使用任何浏览器模拟器,则需要使用标题来访问该页面的内容。此外,您感兴趣的内容是 javascript 加密的。但是,所需内容在该页面的某些脚本标记中可用,因此您可以使用requests
模块以及re
库hjson
来获取它们。如果您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
推荐阅读
- javascript - 如何从具有大量属性的对象数组中获取“极简”对象数组
- php - 谷歌标签管理器在前端可见
- javascript - 如何在 reactJS 中渲染 JSON 文件
- react-native - 如何在 Zendesk API 上上传图像?
- r - 尝试在 R 中使用 dplyr 使用 group_by 和汇总函数时出错
- python - 根本无法打开 Jupyter Notebook
- docker - 如何将 Docker 容器的状态更改为 Dead?
- javascript - 为什么我的页面只显示标题而不显示在 Cloud Firestore 中创建的数据?
- python - 如何循环按钮输入,在python中的不同选项之间循环?
- solidity - 部署时的 Solidity 错误消息:“无法将未定义或空值转换为对象”