使用 Python 从网站请求中获取完整的 html
我尝试向网站(例如 Digikey)发送 http 请求并读取完整的 html。例如,我使用此链接: https://www.digikey.com/products/en?keywords=part_number 获取零件编号,例如: https://www.digikey.com/products/en?keywords=511-8002-KIT 。但是我得到的不是完整的 html。
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.digikey.com/products/en?keywords=511-8002-KIT')
soup = BeautifulSoup(r.text)
print(soup.prettify())
输出:
<!DOCTYPE html>
<html>
<head>
<script>
var i10cdone =(function(){ function pingBeacon(msg){ var i10cimg = document.createElement('script'); i10cimg.src='/i10c@p1/botox/file/nv-loaded.js?status='+window.encodeURIComponent(msg); i10cimg.onload = function(){ (document.head || document.documentElement).removeChild(i10cimg) }; i10cimg.onerror = function(){ (document.head || document.documentElement).removeChild(i10cimg) }; ( document.head || document.documentElement).appendChild(i10cimg) }; pingBeacon('loaded'); if(String(document.cookie).indexOf('i10c.bdddb=c2-f0103ZLNqAeI3BH6yYOfG7TZlRtCrMwqUo')>=0) { document.cookie = 'i10c.bdddb=;path=/';}; var error=''; function errorHandler(e) { if (e && e.error && e.error.stack ) { error=e.error.stack; } else if( e && e.message ) { error = e.message; } else { error = 'unknown';}} if(window.addEventListener) { window.addEventListener('error',errorHandler, false); } else { if ( window.attachEvent ){ window.attachEvent('onerror',errorHandler); }} return function(){ if (window.removeEventListener) {window.removeEventListener('error',errorHandler); } else { if (window.detachEvent) { window.detachEvent('onerror',errorHandler); }} if(error) { pingBeacon('error-' + String(error).substring(0,500)); document.cookie='i10c.bdddb=c2-f0103ZLNqAeI3BH6yYOfG7TZlRtCrMwqUo;path=/'; }}; })();
</script>
<script src="/i10c@p1/client/latest/auto/instart.js?i10c.nv.bucket=pci&i10c.nv.host=www.digikey.com&i10c.opts=botox&bcb=1" type="text/javascript">
</script>
<script type="text/javascript">
INSTART.Init({"apiDomain":"assets.insnw.net","correlation_id":"1553546232:4907a9bdc85fe4e8","custName":"digikey","devJsExtraFlags":"{\"disableQuerySelectorInterception\" :true, 'rumDataConfigKey':'/instartlogic/clientdatacollector/getconfig/monitorprod.json','custName':'digikey','propName':'northamerica'}","disableInjectionXhr":true,"disableInjectionXhrQueryParam":"instart_disable_injection","iframeCommunicationTimeout":3000,"nanovisorGlobalNameSpace":"I10C","partialImage":false,"propName":"northamerica","rId":"0","release":"latest","rum":false,"serveNanovisorSameDomain":true,"third_party":["IA://www.digikey.com/js/geotargeting.js"],"useIframeRpc":false,"useWrapper":false,"ver":"auto","virtualDomains":4,"virtualizeDomains":["^auth\\.digikey\\.com$","^authtest\\.digikey\\.com$","^blocked\\.digikey\\.com$","^dynatrace\\.digikey\\.com$","^search\\.digikey\\.com$","^www\\.digikey\\.ca$","^www\\.digikey\\.com$","^www\\.digikey\\.com\\.mx$"]}
);
</script>
<script>
typeof i10cdone === 'function' && i10cdone();
</script>
</head>
<body>
<script>
setTimeout(function(){document.cookie="i10c.eac23=1";window.location.reload(true);},30);
</script>
</body>
</html>
我需要完整 html 的原因是在其中搜索特定关键字,例如术语“无铅”或“通孔”是否出现在特定零件编号结果中。我不仅在 Digikey 上这样做,还在其他网站上这样做。
任何帮助都将不胜感激!
谢谢!
编辑:
感谢大家的建议/回答。对此感兴趣的其他人可以在此处查看更多信息: 使用 Python 抓取网页 JavaScript 页面
您正在寻找的页面部分很可能包含使用 Javascript 动态生成的内容。
在浏览器中访问
view-source:https://www.digikey.com/products/en?keywords=part_number
,您将看到请求正在获取完整的 html - 它只是没有执行 Javascript 代码。
如果右键单击并单击检查(Chrome),您将看到执行 javascript 代码后创建的最终 DOM。
要获取呈现的内容,您需要使用完整的 Web 驱动程序,如 Selenium ,它能够执行 Javascript 来呈现整个页面。
下面是使用 Selenium 实现此目的的示例:
如何在 Python 中使用 Selenium 和 Beautifulsoup 解析网站?
In [8]: from bs4 import BeautifulSoup In [9]: from selenium import webdriver In [10]: driver = webdriver.Firefox() In [11]: driver.get('http://news.ycombinator.com') In [12]: html = driver.page_source In [13]: soup = BeautifulSoup(html) In [14]: for tag in soup.find_all('title'): ....: print tag.text ....: ....: Hacker News
问题可能是因为页面的 javascript 没有时间运行,因此填充必要的 HTML 元素。解决此问题的一种方法是使用 selenium 实现 webdriver:
from selenium import webdriver
chrome = webdriver.Chrome()
chrome.get("https://www.digikey.com/products/en?keywords=511-8002-KIT")
source = chrome.page_source
通常,这效率低得多,因为您必须完全等待页面加载。解决此问题的一种方法是查找网站提供的各种 API 以直接访问您想要的数据,我建议对这些 API 可能是什么进行一些研究
以下是您可以用来直接获取数据的一些潜在 API