Получение полного HTML обратно из запроса веб-сайта с помощью Python - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь отправить запрос http на веб-сайт (например, Digikey) и прочитать полный 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&amp;i10c.nv.host=www.digikey.com&amp;i10c.opts=botox&amp;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, заключается в поиске в нем определенных ключевых слов, таких как слова "Lead free" или "Through hole", которые появляются в конкретном номере артикула. Я делаю это не только для Digikey, но и для других сайтов.

Любая помощь будет оценена!

Спасибо!

EDIT:

Спасибо всем за ваши предложения / ответы. Больше информации здесь для тех, кто заинтересован в этом: веб-страница JavaScript с Python

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Скорее всего, части страницы, которые вы ищете, содержат контент, который генерируется динамически с использованием Javascript.

Посетите view-source:https://www.digikey.com/products/en?keywords=part_number в своем браузере, и вы увидите, что запросы загружают полный html - он просто не выполняет код Javascript.

Если щелкнуть правой кнопкой мыши и щелкнуть по проверке (Chrome), вы увидите окончательный DOM, созданный после выполнения кода JavaScript.

Чтобы получить визуализированный контент, вам понадобится полноценный веб-драйвер, такой как Selenium , который способен выполнять Javascript для рендеринга полной страницы.

Вот пример того, как этого добиться с помощью Selenium:

Как я могу разобрать сайт, используя Selenium и Beautifulsoup в python?

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
1 голос
/ 25 марта 2019

Проблема может заключаться в том, что у javascript страницы нет времени для запуска, и поэтому он заполняет необходимые элементы HTML.Одним из решений этой проблемы может быть реализация веб-драйвера с использованием селена:

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-интерфейсов.Вы можете использовать для получения данных напрямую

https://api -portal.digikey.com / product

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...