веб-выскабливание с помощью Python и beautifulsoup 3.6 - получение неверный URL-адрес


Я хочу работать с этой страницей на Python: http://www.sothebys.com/en/search-results.html?keyword=degas%27

Вот мой код:

from bs4 import BeautifulSoup
import requests

page = requests.get('http://www.sothebys.com/en/search-results.html?keyword=degas%27')

soup = BeautifulSoup(page.content, "lxml")
print(soup)

Я получаю следующий вывод:

<html><head>
<title>Invalid URL</title>
</head><body>
<h1>Invalid URL</h1>
The requested URL "[no URL]", is invalid.<p>
Reference #9.8f4f1502.1494363829.5fae0e0e
</p></body></html>

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

from bs4 import BeautifulSoup
import requests

page = requests.get('http://www.christies.com/lotfinder/searchresults.aspx?&searchtype=p&action=search&searchFrom=header&lid=1&entry=degas')

soup = BeautifulSoup(page.content, "lxml")
print(soup)

Я также протестировал другие URL-адреса (reddit, google, сайты электронной коммерции) и не обнаружил никаких проблем. Таким образом, один и тот же код работает с одним URL-адресом, а с другим-нет. В чем же проблема?

2 3

2 ответа:

Этот сайт блокирует запросы, не поступающие из любого браузера, таким образом, вы получаете ошибку Invalid URL. Добавление пользовательских заголовков к запросу работает нормально.

import requests
from bs4 import BeautifulSoup

ua = {"User-Agent":"Mozilla/5.0"}
url = "http://www.sothebys.com/en/search-results.html?keyword=degas%27"
page = requests.get(url, headers=ua)
soup = BeautifulSoup(page.text, "lxml")
print(soup)

Измените свой код на

soup = BeautifulSoup(page.text, "lxml")

Если вы используете page.content, то преобразование массива байтов в строку поможет вам, но вы должны пойти с page.text