Як використовувати запити 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.