Bir tarayıcı ziyaretini taklit etmek için Python istekleri nasıl kullanılır?


127

İçeriği aşağıdaki web sitesinden almak istiyorum. Firefox veya Chrome gibi bir tarayıcı kullanırsam, istediğim gerçek web sitesi sayfasını alabilirim, ancak Python istediği paketi (veya wgetkomutu) kullanırsam, tamamen farklı bir HTML sayfası döndürür. Web sitesinin geliştiricisinin bunun için bazı engeller yaptığını düşündüm, bu yüzden soru şu:

Python isteklerini veya wget komutunu kullanarak bir tarayıcı ziyaretini nasıl taklit edebilirim?

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

Yanıtlar:


283

Bir User-Agentbaşlık sağlayın :

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)

Bilginize, farklı tarayıcılar için User-Agent dizelerinin bir listesi:


Bir yan not olarak, kullanıcı aracıları üzerinde güzel bir soyutlama katmanı sağlayan sahte kullanıcı aracısı adı verilen oldukça kullanışlı bir üçüncü taraf paketi var :

Sahte kullanıcıaracısı

Gerçek dünya veritabanıyla güncel basit useragent faker

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'

1
Cevabınız için teşekkürler, isteklerimdeki başlıkları denedim ancak yine de sayfanın gerçek içeriğini alamadım, 'Bu uygulamanın düzgün görüntülenmesi için web tarayıcınızda JavaScript'in etkin olması gerekir.' dönen html sayfasında, isteklere java betik desteği eklemeli miyim? Öyleyse bunu nasıl yaparım?
user1726366

8
@ user1726366: JavaScript desteği ekleyemezsiniz - bunun için bir JavaScript yorumlayıcısına ihtiyacınız var. En basit yaklaşım, gerçek bir Web tarayıcısının JavaScript yorumlayıcısını kullanmaktır, ancak bunu Selenium kullanarak Python'dan otomatikleştirebilirsiniz .
PM 2Ring

1
@ alecxe, @ sputnick: Python istekleri ve tarayıcı kullanmanın farkını karşılaştırmak için paketleri wireshark ile yakalamaya çalıştım, web sitesi url'si statik bir sayfa değil gibi görünüyor, sayfa işlemenin tamamlanmasını beklemem gerekiyor, bu yüzden Selenium geliyor benim için doğru araçlar. Nazik yardımınız için teşekkür ederim. :)
user1726366

4
@ user1726366 evet, gerçek bir tarayıcı + selenyum kullanmanız ihtiyaçlarınızı karşılıyorsa, bu en acısız yaklaşımdır. PhantomJSSelenyum ile başsız tarayıcı kullanabileceğinizi unutmayın . Teşekkürler. (yardımcı
olduysa

Bazı arama motorlarının bazılarını filtrelediği ortaya çıktı UserAgent. Nedenini bilen var mı? Herhangi biri kabul edilebilir UserAgente- postaların bir listesini sağlayabilir mi?
dallonsi

30

bu soru hala geçerli ise

Sahte UserAgent kullandım

Nasıl kullanılır:

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)

çıktı:

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 hatası hala
alınıyor

1
404 farklı bir hata, sayfaya bir tarayıcı kullanarak göz atabileceğinizden emin misiniz?
Umesh Kaushik

Kesinlikle. Kullanmaya çalıştığım web sitesinin tüm Amazon EC2 IP'lerini engellediğini hissediyorum.
Maksim Kniazev

Lütfen buradaki bağlantıya ping atabilir misin? Sonunda deneyebilirim. Ayrıca, IP engellenmişse, hata kodu 403 (yasak) veya 401 (yetkisiz) olmalıdır. Kazıma işlemine hiç izin vermeyen web siteleri var. Daha fazla web sitesi, botların web sitesine erişmesini önlemek için bulut parlaması kullanıyor.
Umesh Kaushik

İşte benim bağlantım regalbloodline.com/music/eminem . Daha önce iyi çalıştı. Python 2 üzerinde çalışma durduruldu. Yerel makinede python 3 üzerinde çalıştı. AWS EC2'ye geçiş burada işe yaramadı. Hata 404 almaya devam etti. Ardından yerel makinede de çalışmayı bıraktı. Tarayıcı öykünmesini kullanmak yerel makinede çalıştı, ancak EC2'de çalışmadı. Sonunda pes ettim ve kazınacak alternatif bir web sitesi buldum. Bu arada, bulut ateşi önlenebilir mi?
Maksim Kniazev

7

Firefox'u sahte kullanıcı aracısı olarak kullanarak bunu yapmayı deneyin (dahası, çerezlerin kullanımıyla web kazıma için iyi bir başlangıç ​​betiği):

#!/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)

KULLANIM:

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

3

Cevabın kökü, soruyu soran kişinin peşinde olduğu şeyi elde etmek için bir JavaScript yorumlayıcısına sahip olması gerektiğidir. Bulduğum şey, json'daki bir web sitesinde istediğim tüm bilgileri JavaScript tarafından yorumlanmadan önce alabildiğim. Bu, her web sayfasının aynı formatta olmasını umarak html'yi ayrıştırmada bana bir ton zaman kazandırdı.

Dolayısıyla, istekleri kullanarak bir web sitesinden bir yanıt aldığınızda html / metne gerçekten bakın çünkü altbilgideki JSON javascripts'i ayrıştırılmaya hazır bulabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.