我正在尝试抓取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的网络加密。
如果有人有解决方案,将不胜感激。
答案 0 :(得分:1)
如果不使用任何浏览器模拟器,则需要使用标题来访问该页面的内容。此外,您感兴趣的内容是用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