python - 带有无头 chromedriver 的 Selenium 无法抓取 Web 数据?
问题描述
我编写了一个简单的程序来从https://stats.nba.com抓取数据。我的代码在这里工作得很好,因为它能够完美地从网站上获取数据:
chrome_options = webdriver.ChromeOptions()
d = webdriver.Chrome(ChromeDriverManager().install(),options=chrome_options)
d.get('https://stats.nba.com/teams/advanced/?sort=W&dir=-1')
scrape = BeautifulSoup(d.page_source, 'html.parser').find('table')
for row in scrape.find_all('tr'):
for col in row.find_all('td'):
#...more parsing code here
但是,只要我添加
chrome_options.add_argument('--headless')
,整个代码都会失败,我得到AttributeError: 'NoneType' object has no attribute 'find_all'
.
为什么会这样?我到处找,找不到解决办法。谢谢!
编辑:问题似乎是d.page_source
对无头和非无头给出不同的结果。有谁知道为什么会有差异?
解决方案
编辑:
我想我已经找到了解决方案。似乎他们有一个系统可以检查浏览器的用户代理,并且他们不允许无头 chrome
所以尝试将此添加到您的代码中:
# ...
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
chrome_options.add_argument(f'user-agent={user_agent}')
# ...
这是我从中收到的输出:
scrape = BeautifulSoup(d.page_source, 'html.parser').find('table')
for row in scrape.find_all('tr'):
print(row)
# <tr>
# <th></th>
# <th cf="" class="text" data-field="TEAM_NAME" ripple="" sort=""><br/>TEAM</th>
# <th cf="" data-dir="-1" data-field="GP" data-rank="" ripple="" sort="">GP</th>
# <th cf="" class="sorted asc" data-dir="-1" data-field="W" data-rank="" ripple="" sort="">W</th>
# <th cf="" data-dir="-1" data-field="L" data-rank="" ripple="" sort="">L</th>
推荐阅读
- regex - 从图像路径中提取 id
- java - 服务器未使用套接字编程在 java 中发送响应
- class - 神秘的 SCSS 覆盖我的 custom.scss
- python - '{{node conv2d_3/Conv2D} 从 1 中减去 3 导致的负维度大小
- python - 类方法:function(self)和function的区别在哪里?
- sql-server - 如何更新 SQL Server 以恢复数据库备份?
- c# - C# 使用替换构建排列,但如果位置中不存在则跳过
- c# - 保留来自 dataReader c# 的 int 变量值
- python - Plotly:如何使所有地块灰度化?
- c# - Entity Framework Core 5 主键问题