首页 > 解决方案 > 尝试使用 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)

这是网站的检查面板:

在此处输入图像描述

这是我的代码的输出:

在此处输入图像描述

谢谢 :)

标签: pythonweb-scrapingbeautifulsouppython-requests

解决方案


有两个原因,您的代码无法正常工作。第一个是,该网站确实需要其他header信息cookie,您可以尝试使用 Inspect Browser Tool 查找并通过添加

requests.get(url, headers=headers, cookies=cookies)

whereheaderscookies是字典。

我相信的另一个原因是,内容是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


推荐阅读