Как использовать запросы Python для имитации посещения браузера?


129

Я хочу получить контент с указанного ниже веб-сайта. Если я использую браузер, такой как Firefox или Chrome, я могу получить настоящую страницу веб-сайта, которую хочу, но если я использую пакет (или wgetкоманду) запросов Python для ее получения, он возвращает совершенно другую HTML-страницу. Я думал, что разработчик веб-сайта сделал для этого несколько блоков, поэтому вопрос:

Как подделать посещение браузера с помощью запросов python или команды wget?

http://www.ichangtou.com/#company:data_000008.html

Ответы:


285

Укажите User-Agentзаголовок :

import requests

url = 'http://www.ichangtou.com/#company:data_000008.html'
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)
print(response.content)

К вашему сведению, вот список строк User-Agent для разных браузеров:


В качестве примечания, существует довольно полезный сторонний пакет под названием fake-useragent, который обеспечивает хороший уровень абстракции над пользовательскими агентами:

поддельный UserAgent

Современный простой пользовательский агент-фейкер с реальной базой данных

Демо-версия:

>>> from fake_useragent import UserAgent
>>> ua = UserAgent()
>>> ua.chrome
u'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'
>>> ua.random
u'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36'

1
спасибо за ваш ответ, я пробовал использовать заголовки в своих запросах, но все еще не смог получить реальное содержимое страницы, есть строка «В вашем веб-браузере должен быть включен JavaScript, чтобы это приложение отображалось правильно». на возвращенной html-странице, следует ли мне добавлять поддержку java-скриптов в запросы? Если да, то как мне это сделать?
user1726366

8
@ user1726366: Вы не можете просто добавить поддержку JavaScript - для этого вам понадобится интерпретатор JavaScript. Самый простой подход - использовать интерпретатор JavaScript реального веб-браузера, но вы можете автоматизировать это из Python с помощью Selenium .
PM 2Ring

1
@ alecxe, @ sputnick: я попытался захватить пакеты с помощью wirehark, чтобы сравнить разницу от использования запросов python и браузера, похоже, что URL-адрес веб-сайта не статический, мне нужно дождаться завершения рендеринга страницы, поэтому звучит Selenium подходящие инструменты для меня. Спасибо за вашу любезную помощь. :)
user1726366

4
@ user1726366 да, если использование настоящего браузера + селен соответствует вашим потребностям, то это самый безболезненный подход. Обратите внимание, что вы можете использовать PhantomJSбезголовый браузер с селеном. Спасибо. (не забудьте принять ответ, если он был полезен)
alecxe

Оказывается, некоторые поисковые системы фильтруют некоторые UserAgent. Кто-нибудь знает почему? Может ли кто-нибудь предоставить список приемлемых UserAgents?
Даллонси,

30

если этот вопрос все еще актуален

Я использовал поддельный UserAgent

Как пользоваться:

from fake_useragent import UserAgent
import requests


ua = UserAgent()
print(ua.chrome)
header = {'User-Agent':str(ua.chrome)}
print(header)
url = "https://www.hybrid-analysis.com/recent-submissions?filter=file&sort=^timestamp"
htmlContent = requests.get(url, headers=header)
print(htmlContent)

вывод:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17
{'User-Agent': 'Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}
<Response [200]>

все еще получаю ошибку 404
Максим Князев

1
404 - это другая ошибка, вы уверены, что можете просматривать страницу с помощью браузера?
Умеш Кошик

Абсолютно. Мне кажется, что веб-сайт, который я пытаюсь использовать, заблокировал все IP-адреса Amazon EC2.
Максим Князев

Не могли бы вы проверить ссылку здесь? Я могу попробовать со своей стороны. Кроме того, если IP заблокирован, код ошибки должен быть 403 (запрещено) или 401 (неавторизовано). Есть сайты, на которых парсинг вообще запрещен. Кроме того, многие веб-сайты используют Cloudflare, чтобы боты не заходили на сайт.
Умеш Кошик

Вот моя ссылка regalbloodline.com/music/eminem . Раньше все работало нормально. Перестал работать на python 2. Работал на python 3 на локальной машине. Переход на AWS EC2 там не работал. Продолжала получать ошибку 404. Затем перестала работать и на локальной машине. Использование эмуляции браузера работало на локальном компьютере, но не на EC2. В конце концов я сдался и нашел альтернативный веб-сайт для очистки. Кстати, можно ли избежать облачного пожара?
Максим Князев

7

Попробуйте сделать это, используя firefox как поддельный пользовательский агент (более того, это хороший сценарий запуска для парсинга веб-страниц с использованием файлов cookie):

#!/usr/bin/env python2
# -*- coding: utf8 -*-
# vim:ts=4:sw=4


import cookielib, urllib2, sys

def doIt(uri):
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    page = opener.open(uri)
    page.addheaders = [('User-agent', 'Mozilla/5.0')]
    print page.read()

for i in sys.argv[1:]:
    doIt(i)

ИСПОЛЬЗОВАНИЕ:

python script.py "http://www.ichangtou.com/#company:data_000008.html"

3

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

Поэтому, когда вы получаете ответ от веб-сайта с использованием запросов, действительно посмотрите на html / text, потому что вы можете найти javascripts JSON в нижнем колонтитуле, готовом для анализа.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.