Як використовувати запити Python для підробленого відвідування браузера?


127

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

Як підробити відвідування браузера, використовуючи запити python або команду wget?

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

Відповіді:


281

Укажіть 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)

FYI, ось список рядків User-Agent для різних браузерів:


Як бічна примітка, є досить корисний сторонній пакет під назвою фальшивий 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 у запитах? Якщо так, як би я це зробив?
— користувач1726366

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

1
@ alecxe, @ sputnick: Я спробував захопити пакети за допомогою проводки, щоб порівняти різницю від використання запитів python та браузера, схоже, що URL-адреса веб-сайту не є статичною, мені потрібно чекати завершення сторінки, тому селен звучить правильні інструменти для мене. Дякую за добру допомогу. :)
— користувач1726366

4
@ user1726366 Так, якщо використання реального браузера + селен відповідає вашим потребам, то це самий безболісний підхід. Зауважте, що ви можете використовувати PhantomJSбезголовий браузер із селеном. Дякую. (не забудьте прийняти відповідь, якщо це було корисно)
— alecxe

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 (несанкціоновано). Є веб-сайти, які взагалі не дозволяють скребкувати. Крім того, багато веб-сайтів користуються хмарою, щоб уникнути ботів доступу до веб-сайту.
— Умеш Каушик

Ось моє посилання 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 / текст, тому що ви можете знайти JSON Javascripts у нижньому колонтитулі, готовому до розбору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.