python - 尝试使用 requests 库进行网络抓取时,为什么我得到一个空的 body 标签内容?
问题描述
我一直在尝试使用请求和 Beautifulsoup python 库在网站上使用网络抓取。问题是我正在获取网页的 html 数据,但正文标记内容为空,而在网站的检查面板上却不是。有谁可以解释为什么会发生这种情况,我该怎么做才能获得身体的内容?
这是我的代码:
from bs4 import BeautifulSoup
import requests
source = requests.get('https://webaccess-il.rexail.com/?s_jwe=eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..gKfb7AnqhUiIMIn0PGb35g.SUsLS70gBec9GBgraaV5BK8hKyqm-VvMSNjP3nIumtcrj9h19zOkYjaBHrW4SDL10DjeIcwQcz9ul1p8umMHKxPPC-QZpCyJbk7JQkUSqFM._d_sGsiSyPF_Xqs2hmLN5A#/store-products-shopping-non-customers').text
soup = BeautifulSoup(source, 'lxml')
print(soup)
这是网站的检查面板:
这是我的代码的输出:
谢谢 :)
解决方案
有两个原因,您的代码无法正常工作。第一个是,该网站确实需要其他header
信息cookie
,您可以尝试使用 Inspect Browser Tool 查找并通过添加
requests.get(url, headers=headers, cookies=cookies)
whereheaders
和cookies
是字典。
我相信的另一个原因是,内容是Javascript
在构建端之后动态加载的,而您得到的是最初加载的网站。
为了也为您提供一个解决方案,我附上了一个使用 Selenium 的示例,它模拟了一个完整的浏览器,它确实为整个网站提供服务,但是 selenium 有一些设置开销,你可以很容易地用谷歌搜索。
from time import sleep
from selenium import webdriver
from bs4 import BeautifulSoup
url = 'https://webaccess-il.rexail.com/?s_jwe=eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..gKfb7AnqhUiIMIn0PGb35g.SUsLS70gBec9GBgraaV5BK8hKyqm-VvMSNjP3nIumtcrj9h19zOkYjaBHrW4SDL10DjeIcwQcz9ul1p8umMHKxPPC-QZpCyJbk7JQkUSqFM._d_sGsiSyPF_Xqs2hmLN5A#/store-products-shopping-non-customers'
driver = webdriver.Firefox()
driver.get(url)
sleep(10)
content = driver.page_source
soup = BeautifulSoup(content)
如果您希望浏览器模拟不可见,您可以添加
from selenium.webdriver.firefox.options import Options
options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)
这将使它在后台运行。
除了 Firefox,您几乎可以使用任何使用适当驱动程序的浏览器。
可以在此处找到基于 Linux 的设置示例Link
推荐阅读
- r - 在R中按组提取最小值/最大值
- java - 文件阅读器打印出“?” 而不是文件
- python - “元组”对象没有属性“剪辑”
- c# - 如果没有要下载或安装的更新,如何退出 C# 控制台应用程序?
- c# - Cloud front 后面的 AWS S3 - 如何使用 c# 访问
- vb.net - VB.Net-如何获取文件夹中最近创建的文件/如何从文件夹中获取 10 个最新文件
- api - 如何存储和响应 API 请求的变量
- docker - 如何向 pod 提供文件?
- python - 如何避免 az ml run --submit-script 命令中出现错误“conda --version: conda not found”?
- flutter - canvas.drawImage 将焦点更改为中心