Почему request.get () возвращает неверный контент страницы? - PullRequest
0 голосов
/ 14 января 2020

Я пытался проанализировать веб-страницу с помощью BeautifulSoup. Когда я импортирую urlopen fromm urllib.request и открываю https://pbejobbers.com, вместо самой веб-страницы возвращается следующее:

<html>
  <body>
    <script src="/aes.min.js" type="text/javascript"></script>
    <script>
         function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[
      0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("0181cdf0013bf7
      0f89e91be7ef0d00c2"),b=toNumbers("a168ceeade18bccc1cdd77af68ef1753"),c=toNumbers("200a38f39b6a3fe3564acf9bd88c25da");document.cookie="OCXS="+toHex(slowAES.decryp
      t(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";document.location.href="http://pbejobbers.com/product/search?search=USC4215&81e93addddb02a10cd0652f09
      370ae96=1";
    </script>
  </body>
</html>

У меня есть массив кодов UP C, которые я использую для поиска продукты, которые я ищу. Я передаю массив в функцию и анализирую html, чтобы найти необходимые теги, но я могу добраться до фактического html. Вот мой код:

from urllib.request import urlopen
from bs4 import BeautifulSoup

upc_codes = ['USC4215', 'USC4225', 'USC12050']

def retrunh1(upc):
    html = urlopen('https://pbejobbers.com/product/search?search={}'.format(upc))
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.prettify())

if __name__=='__main__':
    for upc in upc_codes:
        retrunh1(upc)

Я думаю, что проблема с функцией запроса. Я изолировал его, чтобы увидеть, что он возвращает, и я получаю тот же html обратно, как указано выше, когда я делаю это:

import requests

r = requests.get('https://pbejobbers.com')

print(r.text)

Я довольно новичок в разборе веб-страниц, и мне нужно некоторое предложение о том, как решить это. Спасибо

Ответы [ 3 ]

1 голос
/ 14 января 2020

при поиске вручную USC4215, URL-адрес https://pbejobbers.com/product/search?search=USC4215&_rand=0.35863039778309025

На веб-сайте добавляется случайный секрет _rand для предотвращения сканирования веб-сайтов роботом. вам нужно сделать запрос с действительным случайным секретом, чтобы получить ответ.

На самом деле, обычно секрет создается с набором файлов cookie, если вы нажимаете Inspect ==> Network ==> Doc и Ctrl + R для обновления сайта, вы найдете больше информации о сетевом трафике c, когда будете делать другой запрос, в точности, каков ваш http-запрос и содержание ответа.

1 голос
/ 14 января 2020

Пожалуйста, попробуйте это.

Python код:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import re

upc_codes = ['USC4215', 'USC4225', 'USC12050']

def retrunh1(upc):
    payload = {'search': upc }
    r = requests.get('https://pbejobbers.com/product', params=payload)
    matches = re.search(r'document\.location\.href=\"(:?.*)=1\";', str(r.text), re.M|re.S)
    url = matches[1]

    response = requests.get(url)

    for resp in response.history:
      r = requests.post(resp.headers['Location'])
      soup = BeautifulSoup(r.content, 'html.parser')
      print(soup.prettify())

if __name__=='__main__':
    for upc in upc_codes:
        retrunh1(upc)

Вывод:

<div class="page-area-container">
    <div class=" middlebar">
        <div class=" middlebar__left">
            <a class=" logo" href="/">
                <img alt="PBE Jobbers" class=" logo-img" src="/bundles/pjfrontend/pbejobbers/images/logo/pbe-logo.svg?version=9d4c5d60"/>
            </a>
        </div>
        ...
    </div>
    ...
</div>
1 голос
/ 14 января 2020

javascript, вероятно, динамически заполняет часть страницы html, когда браузер начинает ее выполнять, поэтому urllib не может загрузить полный исходный код.

Ваш сценарий python должен используйте автономную структуру браузера, такую ​​как Selenium , чтобы загрузить страницу так, как браузер, и затем извлечь то, что вам нужно.

Как уже упоминалось, пожалуйста, не нарушайте их условия обслуживания, особенно если данные приватны / за страницей входа

...