запросы Python и обнаружение бота BeautifulSoup - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь очистить все HTML-элементы страницы, используя запросы и Beautifulsoup. Я использую ASIN (стандартный идентификационный номер Amazon), чтобы получить информацию о продукте на странице. Мой код выглядит следующим образом:

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

url = "http://www.amazon.com/dp/" + 'B004CNH98C'
response = urlopen(url)
soup = BeautifulSoup(response, "html.parser")
print(soup)

Но вывод не отображает весь HTML-код страницы, поэтому я не могу продолжить свою работу с деталями продукта. Любая помощь в этом?

РЕДАКТИРОВАТЬ 1:

Из приведенного ответа показывает разметку страницы обнаружения ботов. Я немного исследовал и нашел два способа его преодоления:

  1. Возможно, мне потребуется добавить заголовок в запросах, но я не мог понять, каково должно быть значение заголовка.
  2. Используйте Селен. Теперь мой вопрос: оба способа обеспечивают равную поддержку?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Как уже говорилось в некоторых комментариях, если вам нужно как-то взаимодействовать с Javascript на странице, лучше использовать селен. Тем не менее, относительно вашего первого подхода с использованием заголовка:

import requests
from bs4 import BeautifulSoup

url = "http://www.amazon.com/dp/" + 'B004CNH98C'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text,"html.parser")

Эти заголовки немного устарели, но все равно должны работать. Используя их, вы притворяетесь, что ваш запрос поступил от обычного веб-браузера. Если вы используете requests без такого заголовка, ваш код в основном сообщает серверу, что запрос поступает от python, который большинство серверов отклоняет сразу.

Другой альтернативой для вас также может быть fake-useragent возможно, вы также можете попробовать это.

0 голосов
/ 20 ноября 2018

Лучше использовать fake_useragent, чтобы упростить процесс. Случайный пользовательский агент отправляет запрос через статистику использования браузера в реальном мире. Если вам не нужен динамический контент, вам почти всегда лучше просто запрашивать контент страницы по HTTP и анализировать его программно.

import requests
from fake_useragent import UserAgent
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
ua=UserAgent();
hdr = {'User-Agent': ua.random,
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
      'Accept-Encoding': 'none',
      'Accept-Language': 'en-US,en;q=0.8',
      'Connection': 'keep-alive'}
url = "http://www.amazon.com/dp/" + 'B004CNH98C'
response = requests.get(url, headers=hdr)
print response.content

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

0 голосов
/ 29 августа 2018

попробуйте это:

import requests
from bs4 import BeautifulSoup

url = "http://www.amazon.com/dp/" + 'B004CNH98C'
r = requests.get(url)
r = r.text

##options #1
#  print r.text

soup = BeautifulSoup( r.encode("utf-8") , "html.parser")

### options 2
print(soup)
...