Во-первых, код:
import requests
from bs4 import BeautifulSoup
url = 'https://stackoverflow.com/questions/tagged/python'
payload = {'pageSize': '5'}
r = requests.get(url, params=payload)
content = r.text
soup = BeautifulSoup(content, 'html.parser')
questions = soup.select('div#questions h3')
print(r.url)
print(len(questions))
Выход
https://stackoverflow.com/questions/tagged/python?pageSize=5
50
Ожидаемый результат
https://stackoverflow.com/questions/tagged/python?pageSize=5
5
При выполнении вышеуказанного запроса stackoverflow.com, похоже, частично игнорирует параметр pageSize. Я говорю полу-игнорирование, потому что r.text действительно содержит '<meta property = "og: url" content = "https://stackoverflow.com/questions/tagged/python?pageSize = 5" />', что означает, что он знает о параметр. Но он возвращает 50 вопросов. Если вы перейдете к https://stackoverflow.com/questions/tagged/python?pageSize=5 напрямую, он вернет только 5 вопросов.
Есть ли способ заставить stackoverflow.com уважать параметр URL, отправленный через HTTP-запросы?
@Rafalsonn, да, я.
Проблема была в вашем User-Agent
, поэтому заголовки requests
выглядят так
{'User-Agent': 'python-requests/2.19.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
Обратите внимание, что ваш User-Agent
- это «python-запросы». Итак, StackOverflow игнорирует параметры запроса, потому что знает, что он поступает не из реального браузера. Чтобы преодолеть это, вы можете просто передать пустые заголовки при выполнении такого запроса,
requests.get(url, headers='')
Спасибо. Это работает. Есть идеи, можно ли сделать с библиотекой запросов?
Я пытаюсь с requests
обновлять этот ответ, как только выясню.
Привет, я обновил ответ, дайте мне знать, работает ли это @Webucator
Вы запрашиваете веб-сайт, но не запрашиваете API stackoverflow?