จะใช้คำขอ Python เพื่อปลอมการเยี่ยมชมเบราว์เซอร์ได้อย่างไร


129

ฉันต้องการรับเนื้อหาจากเว็บไซต์ด้านล่าง หากฉันใช้เบราว์เซอร์เช่น Firefox หรือ Chrome ฉันจะได้รับหน้าเว็บไซต์จริงที่ฉันต้องการ แต่ถ้าฉันใช้แพคเกจคำขอ Python (หรือwgetคำสั่ง) เพื่อรับมันจะส่งคืนหน้า 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)

FYI นี่คือรายการสตริง User-Agent สำหรับเบราว์เซอร์ต่างๆ:


ตามหมายเหตุด้านข้างมีแพ็คเกจของบุคคลที่สามที่มีประโยชน์ซึ่งเรียกว่าfake-useragentซึ่งให้เลเยอร์นามธรรมที่ดีเหนือตัวแทนผู้ใช้:

ปลอม UserAgent

อัปเดตล่าสุด useragent faker พร้อมฐานข้อมูลจริง

การสาธิต:

>>> 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 ของเว็บเบราเซอร์จริง แต่คุณสามารถอัตโนมัติว่าจากงูหลามใช้ซีลีเนียม
PM 2Ring

1
@ alecxe, @ sputnick: ฉันพยายามจับภาพแพ็คเก็ตด้วย Wirehark เพื่อเปรียบเทียบความแตกต่างจากการใช้คำขอ python และเบราว์เซอร์ดูเหมือนว่า url ของเว็บไซต์จะไม่คงที่ฉันต้องรอให้หน้าแสดงผลเสร็จสมบูรณ์ดังนั้นSeleniumจึงฟัง เครื่องมือที่เหมาะสมสำหรับฉัน ขอบคุณสำหรับความช่วยเหลือ :)
user1726366

4
@ user1726366 ใช่ถ้าใช้เบราว์เซอร์จริง + ซีลีเนียมเหมาะกับความต้องการของคุณนี่เป็นวิธีที่ไม่เจ็บปวดที่สุด โปรดทราบว่าคุณสามารถใช้PhantomJSเบราว์เซอร์ที่ไม่มีหัวกับซีลีเนียมได้ ขอบคุณ (อย่าลืมยอมรับคำตอบหากเป็นประโยชน์)
alecxe

UserAgentกลับกลายเป็นเครื่องมือค้นหาบางกรองบาง ใครทราบสาเหตุ? ใครช่วยให้รายชื่อของที่ยอมรับได้ UserAgent?
dallonsi

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
Maksim Kniazev

1
404 เป็นข้อผิดพลาดที่แตกต่างกันคุณแน่ใจว่าสามารถเรียกดูหน้าโดยใช้เบราว์เซอร์ได้หรือไม่?
Umesh Kaushik

อย่างแน่นอน ฉันรู้สึกเหมือนว่าเว็บไซต์ที่ฉันพยายามใช้ Amazon EC2 IP ทั้งหมดถูกบล็อก
Maksim Kniazev

คุณช่วย ping ลิงค์ที่นี่ได้ไหม ฉันสามารถพยายามในตอนท้ายของฉัน นอกจากนี้หาก IP ถูกบล็อกรหัสข้อผิดพลาดควรเป็น 403 (ห้ามใช้) หรือ 401 (ไม่ได้รับอนุญาต) มีเว็บไซต์ที่ไม่อนุญาตให้ขูดเลย นอกจากนี้เว็บไซต์จำนวนมากใช้ cloudflare เพื่อหลีกเลี่ยงบอทในการเข้าถึงเว็บไซต์
Umesh Kaushik

นี่คือการเชื่อมโยงของฉันregalbloodline.com/music/eminem มันทำงานได้ดีมาก่อน หยุดทำงานบน python 2 ทำงานบน python 3 บนเครื่องโลคัล การย้ายไปยัง AWS EC2 ไม่ทำงานที่นั่น ยังคงได้รับข้อผิดพลาด 404 จากนั้นก็หยุดทำงานบนเครื่องภายในด้วย การใช้การจำลองเบราว์เซอร์ทำงานบนเครื่องท้องถิ่น แต่ไม่ใช่บน EC2 ในที่สุดฉันก็ยอมแพ้และพบว่ามีเว็บไซต์อื่นให้ขูด ยังไงก็ตาม cloudfire สามารถหลีกเลี่ยงได้?
Maksim Kniazev

7

ลองทำสิ่งนี้โดยใช้ firefox เป็นตัวแทนผู้ใช้ปลอม(นอกจากนี้ยังเป็นสคริปต์เริ่มต้นที่ดีสำหรับการขูดเว็บด้วยการใช้คุกกี้):

#!/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 ในส่วนท้ายพร้อมที่จะแยกวิเคราะห์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.