python-3.x - 使用 bs4 抓取动态内容
问题描述
我正在从 mobile_comparison_website 抓取一些信息。但它的内容看起来是动态的。我正在尝试使用 selenium 抓取动态内容,但它也没有给我预期的输出。
from bs4 import BeautifulSoup as bs
from selenium import webdriver
path = r'C:\\Users\\Goku\\Downloads\\Compressed\\chromedriver'
driver = webdriver.Chrome(path)
driver.get('https://versus.com/en')
res = driver.execute_script("return document.documentElement.outerHTML")
soup = bs(res, 'lxml')
box = soup.find('div', {'class':'CarouList__carouList___2WspW
CarouList__isLandingPage___rPe4J'})
print(box)
解决方案
您可以在标签下的 html 源代码中找到数据<script>
。找到该文本,将字符串操作为有效的 json 格式,然后用于json.loads()
读取它。然后您可以查看该结构并提取您想要的内容。图像的 url 在那里找到:
import requests
from bs4 import BeautifulSoup as soup
import json
my_url = 'https://versus.com/en'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
# opening up connection, grabbing the page
response = requests.get(my_url, headers=headers)
#html parsing
page_soup = soup(response.text, "html.parser")
scripts = page_soup.find_all('script')
for script in scripts:
if 'window.__data=' in script.text:
jsonStr = script.text
jsonStr = jsonStr.split('window.__data=')[-1]
jsonData = json.loads(jsonStr)
phones = jsonData['landing']['trendings']['phone']['list']
for each in phones:
root_url = 'https://versus.dadi.network'
popImage = root_url + each['popImage']
rivalImage = root_url + each['rivalImage']
print ('%s\n%s' %(popImage, rivalImage))
输出:
https://versus.dadi.network/samsung-galaxy-a9-2018/front/front-1539337417084.variety.jpg
https://versus.dadi.network/samsung-galaxy-a50/front/front-1551183669492.variety.jpg
https://versus.dadi.network/samsung-galaxy-s10-plus/front/front-1550699605210.variety.jpg
https://versus.dadi.network/apple-iphone-xs-max/front/front-1536781345067.variety.jpg
https://versus.dadi.network/samsung-galaxy-a50/front/front-1551183669492.variety.jpg
https://versus.dadi.network/huawei-p30-lite/front/front-1555000229505.variety.jpg
https://versus.dadi.network/xiaomi-redmi-note-7/front/front-1550507767671.variety.jpg
https://versus.dadi.network/xiaomi-mi-8-lite/front/front-1537824165879.variety.jpg
https://versus.dadi.network/samsung-galaxy-s8/front/front-1490950798404.variety.jpg
https://versus.dadi.network/samsung-galaxy-a50/front/front-1551183669492.variety.jpg
https://versus.dadi.network/huawei-p20-lite/front/front-1521538430205.variety.jpg
https://versus.dadi.network/huawei-p-smart-2019/front/front-1547733931933.variety.jpg
https://versus.dadi.network/samsung-galaxy-a50/front/front-1551183669492.variety.jpg
https://versus.dadi.network/samsung-galaxy-a30/front/front-1551187893794.variety.jpg
https://versus.dadi.network/samsung-galaxy-m20/front/front-1550059143173.variety.jpg
https://versus.dadi.network/samsung-galaxy-a30/front/front-1551187893794.variety.jpg
https://versus.dadi.network/oneplus-6t/front/front-1540985964061.variety.jpg
https://versus.dadi.network/google-pixel-3/front/front-1539114763774.variety.jpg
https://versus.dadi.network/samsung-galaxy-a40/front/front-1555086727000.variety.jpg
https://versus.dadi.network/huawei-p20-lite/front/front-1521538430205.variety.jpg
推荐阅读
- r - 如何让 R 预测用户输入
- python-3.x - 天空场数据以获取给定日期范围内的远地点和近地点
- elasticsearch - 使用 logstash 将数据集导入到 ElasticSearch 很慢
- php - Docker 容器上的 PHP XDebug 在 VS Code 中不起作用(Laravel 和 docker-compose)
- javascript - 是否有任何选项可以通过循环将 div id 降低一个?
- python - 根据元素名称在python中对长列表的元素进行分组
- mysql - 存储过程语法错误中的临时表
- java - Android:我的创建表语句有什么问题?
- c++ - 流利的编程内存分配问题 C++
- android - 接收广播 Intent 时出错 { act=com.google.android.gms.appinvite.intent.action.INVITE_SENT