Làm thế nào để sử dụng các yêu cầu Python để giả mạo một lượt truy cập trình duyệt?


127

Tôi muốn lấy nội dung từ trang web bên dưới. Nếu tôi sử dụng trình duyệt như Firefox hoặc Chrome, tôi có thể nhận được trang web thực mà tôi muốn, nhưng nếu tôi sử dụng gói (hoặc wgetlệnh) yêu cầu Python để lấy nó, nó sẽ trả về một trang HTML hoàn toàn khác. Tôi nghĩ rằng nhà phát triển của trang web đã thực hiện một số quy tắc cho việc này, vì vậy câu hỏi là:

Làm cách nào để giả mạo lượt truy cập trình duyệt bằng cách sử dụng yêu cầu python hoặc lệnh wget?

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

Câu trả lời:


282

Cung cấp User-Agenttiêu đề :

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, đây là danh sách các chuỗi Tác nhân Người dùng cho các trình duyệt khác nhau:


Lưu ý thêm, có một gói bên thứ ba khá hữu ích được gọi là fake-useragent cung cấp một lớp trừu tượng đẹp mắt trên các tác nhân người dùng:

giả-sử dụng

Cập nhật người chơi sử dụng đơn giản với cơ sở dữ liệu thế giới thực

Bản giới thiệu:

>>> 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
Cảm ơn câu trả lời của bạn, tôi đã thử với các tiêu đề trong yêu cầu của mình nhưng vẫn không thể lấy được nội dung thực của trang, có một chuỗi 'Trình duyệt web của bạn phải bật JavaScript để ứng dụng này hiển thị chính xác.' trong trang html trả về, tôi có nên thêm hỗ trợ tập lệnh java trong các yêu cầu không? Nếu vậy tôi sẽ làm điều đó như thế nào?
user1726366

8
@ user1726366: Bạn không thể chỉ cần thêm hỗ trợ JavaScript - bạn cần một trình thông dịch JavaScript cho việc đó. Cách tiếp cận đơn giản nhất là sử dụng trình thông dịch JavaScript của một trình duyệt Web thực, nhưng bạn có thể tự động hóa nó từ Python bằng Selenium .
PM 2Ring

1
@ alecxe, @ sputnick: Tôi đã cố gắng nắm bắt các gói bằng wirehark để so sánh sự khác biệt giữa việc sử dụng trình duyệt và yêu cầu python, có vẻ như url trang web không phải là url tĩnh, tôi phải đợi kết xuất trang hoàn tất, vì vậy âm thanh Selenium các công cụ phù hợp với tôi. Cảm ơn lòng giúp đỡ tốt bụng của bạn. :)
user1726366

4
@ user1726366 yup, nếu sử dụng trình duyệt thực + selen phù hợp với nhu cầu của bạn thì đây là cách tiếp cận dễ dàng nhất. Lưu ý rằng bạn có thể sử dụng PhantomJStrình duyệt không đầu với selen. Cảm ơn. (đừng quên để chấp nhận câu trả lời nếu nó là hữu ích)
alecxe

Hóa ra một số công cụ tìm kiếm lọc một số UserAgent. Có ai biết tại sao không? Bất cứ ai có thể cung cấp một danh sách các UserAgents được chấp nhận ?
dallonsi

30

nếu câu hỏi này vẫn còn giá trị

Tôi đã sử dụng UserAgent giả mạo

Cách sử dụng:

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)

outPut:

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]>

vẫn nhận được Lỗi 404
Maksim Kniazev

1
404 là một lỗi khác, bạn có chắc mình có thể duyệt trang bằng trình duyệt không?
Umesh Kaushik

Chắc chắn rồi. Tôi cảm thấy như trang web mà tôi đang cố gắng sử dụng đã bị chặn tất cả các IP Amazon EC2.
Maksim Kniazev

Bạn có thể vui lòng ping liên kết ở đây? Tôi có thể cố gắng cuối cùng của tôi. Hơn nữa, nếu IP bị chặn thì mã lỗi sẽ là 403 (bị cấm) hoặc 401 (trái phép). Có những trang web hoàn toàn không cho phép cạo. Hơn nữa, nhiều trang web sử dụng cloudflare để tránh bot truy cập vào trang web.
Umesh Kaushik

Đây là liên kết của tôi regalbloodline.com/music/eminem . Nó hoạt động tốt trước đây. Đã dừng hoạt động trên python 2. Đã hoạt động trên python 3 trên máy cục bộ. Chuyển đến AWS EC2 không hoạt động ở đó. Vẫn nhận được Lỗi 404. Sau đó cũng ngừng hoạt động trên máy cục bộ. Sử dụng mô phỏng trình duyệt hoạt động trên máy cục bộ nhưng không hoạt động trên EC2. Cuối cùng tôi đã từ bỏ và tìm trang web thay thế để cạo. Nhân tiện là đám mây có thể tránh được?
Maksim Kniazev

7

Hãy thử làm điều này, sử dụng firefox làm tác nhân người dùng giả mạo (hơn nữa, đó là một tập lệnh khởi động tốt để tìm kiếm web bằng cách sử dụng 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)

SỬ DỤNG:

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

3

Gốc của câu trả lời là người đặt câu hỏi cần phải có một trình thông dịch JavaScript để có được những gì họ đang theo đuổi. Những gì tôi đã tìm thấy là tôi có thể lấy tất cả thông tin tôi muốn trên một trang web bằng json trước khi nó được JavaScript diễn giải. Điều này đã giúp tôi tiết kiệm rất nhiều thời gian trong việc phân tích cú pháp html với hy vọng mỗi trang web có cùng một định dạng.

Vì vậy, khi bạn nhận được phản hồi từ một trang web sử dụng các yêu cầu, hãy thực sự nhìn vào html / text vì bạn có thể tìm thấy javascripts JSON ở chân trang đã sẵn sàng được phân tích cú pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.