Bagaimana cara menggunakan permintaan Python untuk memalsukan kunjungan browser?

127

Saya ingin mendapatkan konten dari situs web di bawah ini. Jika saya menggunakan browser seperti Firefox atau Chrome, saya bisa mendapatkan halaman situs web asli yang saya inginkan, tetapi jika saya menggunakan paket permintaan Python (atau wgetperintah) untuk mendapatkannya, halaman tersebut mengembalikan halaman HTML yang sama sekali berbeda. Saya pikir pengembang situs web telah membuat beberapa blok untuk ini, jadi pertanyaannya adalah:

Bagaimana cara memalsukan kunjungan browser dengan menggunakan permintaan python atau perintah wget?

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

pengguna1726366
sumber

Jawaban:

283

Berikan User-Agenttajuk :

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, berikut adalah daftar string Agen-Pengguna untuk browser yang berbeda:


Sebagai catatan tambahan, ada paket pihak ketiga yang cukup berguna bernama fake-useragent yang menyediakan lapisan abstraksi yang bagus di atas agen pengguna:

agen pengguna palsu

Up to date agen pengguna sederhana dengan database dunia nyata

Demo:

>>> 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'
alecxe
sumber
1
terima kasih atas jawaban Anda, saya mencoba dengan tajuk dalam permintaan saya tetapi masih tidak bisa mendapatkan konten halaman yang sebenarnya, ada string 'Browser web Anda harus mengaktifkan JavaScript agar aplikasi ini ditampilkan dengan benar.' di halaman html yang dikembalikan, haruskah saya menambahkan dukungan java script dalam permintaan? Jika demikian, bagaimana saya melakukannya?
pengguna1726366
8
@ user1726366: Anda tidak bisa begitu saja menambahkan dukungan JavaScript - Anda memerlukan penerjemah JavaScript untuk itu. Pendekatan paling sederhana adalah dengan menggunakan penerjemah JavaScript dari browser Web yang sebenarnya, tetapi Anda dapat mengotomatiskannya dari Python menggunakan Selenium .
PM 2Ring
1
@ alecxe, @ sputnick: Saya mencoba untuk menangkap paket dengan wireshark untuk membandingkan perbedaan dari menggunakan permintaan python dan browser, sepertinya url situs web bukan statis saya harus menunggu halaman render selesai, jadi Selenium terdengar alat yang tepat untuk saya. Terima kasih atas bantuannya. :)
user1726366
4
@ user1726366 yup, jika menggunakan browser nyata + selenium sesuai dengan kebutuhan Anda maka ini adalah pendekatan yang paling mudah. Perhatikan bahwa Anda dapat menggunakan PhantomJSbrowser tanpa kepala dengan selenium. Terima kasih. (jangan lupa untuk menerima jawabannya jika itu membantu)
alecxe
Ternyata beberapa mesin pencari memfilter beberapa UserAgent. Ada yang tahu kenapa? Adakah yang bisa memberikan daftar yang dapat diterima UserAgent?
dallonsi
30

jika pertanyaan ini masih berlaku

Saya menggunakan UserAgent palsu

Cara Penggunaan:

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)

keluaran:

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]>
Umesh Kaushik
sumber
masih mendapatkan Kesalahan 404
Maksim Kniazev
1
404 adalah kesalahan yang berbeda, Anda yakin dapat menelusuri halaman menggunakan browser?
Umesh Kaushik
Benar. Saya merasa situs web yang saya coba gunakan memblokir semua IP Amazon EC2.
Maksim Kniazev
Bisakah Anda mem-ping tautan di sini? Saya bisa mencoba di akhir saya. Selanjutnya jika IP diblokir maka kode kesalahan harus 403 (dilarang) atau 401 (tidak sah). Ada situs web yang tidak mengizinkan pengikisan sama sekali. Lebih jauh lagi, banyak situs web yang menggunakan cloudflare untuk menghindari bot mengakses situs web.
Umesh Kaushik
Ini link saya regalbloodline.com/music/eminem . Ini bekerja dengan baik sebelumnya. Berhenti mengerjakan python 2. Bekerja pada python 3 di mesin lokal. Pindah ke AWS EC2 tidak bekerja di sana. Terus mendapatkan Kesalahan 404. Kemudian berhenti bekerja pada mesin lokal juga. Menggunakan emulasi browser berfungsi di komputer lokal tetapi tidak di EC2. Pada akhirnya saya menyerah dan menemukan situs web alternatif untuk dikikis. Ngomong-ngomong, apakah cloudfire bisa dihindari?
Maksim Kniazev
7

Coba lakukan ini, menggunakan firefox sebagai agen pengguna palsu (terlebih lagi, ini adalah skrip startup yang baik untuk web scraping dengan menggunakan 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)

PEMAKAIAN:

python script.py "http://www.ichangtou.com/#company:data_000008.html"
Gilles Quenot
sumber
3

Akar dari jawabannya adalah bahwa orang yang mengajukan pertanyaan tersebut harus memiliki juru bahasa JavaScript untuk mendapatkan apa yang mereka cari. Apa yang saya temukan adalah saya bisa mendapatkan semua informasi yang saya inginkan di situs web di json sebelum diinterpretasikan oleh JavaScript. Ini telah menghemat banyak waktu saya dalam apa yang akan menjadi parsing html dengan harapan setiap halaman web dalam format yang sama.

Jadi ketika Anda mendapatkan respon dari sebuah situs web yang menggunakan permintaan benar-benar melihat html / teks karena Anda mungkin menemukan JSON javascript di footer siap untuk diurai.

Daniel Butler
sumber