如何使用Python请求伪造浏览器访问?

use*_*366 100 html python wget web-scraping python-requests

我想从以下网站获取内容.如果我使用像Firefox或Chrome这样的浏览器,我可以获得我想要的真实网站页面,但如果我使用Python请求包(或wget命令)来获取它,它将返回一个完全不同的HTML页面.我认为网站的开发者为此做了一些块,所以问题是:

如何使用python请求或命令wget伪造浏览器访问?

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

ale*_*cxe 230

提供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)
Run Code Online (Sandbox Code Playgroud)

仅供参考,这是不同浏览器的用户代理字符串列表:


作为旁注,有一个非常有用的第三方软件包叫做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'
Run Code Online (Sandbox Code Playgroud)

  • @ user1726366:你不能简单地添加JavaScript支持 - 你需要一个JavaScript解释器.最简单的方法是使用真实Web浏览器的JavaScript解释器,但您可以使用[Selenium](https://pypi.python.org/pypi/selenium)从Python自动化. (7认同)
  • 这是当今攻击我们的顶级用户代理,我想知道为什么>< (7认同)
  • @ user1726366是的,如果使用真正的浏览器+ selenium符合您的需求那么这是最无痛的方法.请注意,您可以使用带有selenium的"PhantomJS"无头浏览器.谢谢.(如果有帮助,别忘了接受答案) (4认同)
  • 感谢您的回答,我尝试使用请求中的标头,但仍然无法获取页面的真实内容,有一个字符串“您的网络浏览器必须启用 JavaScript 才能使该应用程序正确显示”。在返回的html页面中,我应该在请求中添加java脚本支持吗?如果是这样我会怎么做? (3认同)

Ume*_*hik 25

如果这个问题仍然有效

我使用假的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)
Run Code Online (Sandbox Code Playgroud)

输出:

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]>
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 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)
Run Code Online (Sandbox Code Playgroud)

用法:

python script.py "http://www.ichangtou.com/#company:data_000008.html"
Run Code Online (Sandbox Code Playgroud)


Dan*_*ler 7

答案的根源是提出问题的人需要有一个 JavaScript 解释器才能得到他们想要的东西。我发现我能够在 JavaScript 解释之前在网站上以 JSON 格式获取我想要的所有信息。这为我节省了大量解析 HTML 内容的时间,希望每个网页都采用相同的格式。

因此,当您使用 Requests 从网站获得响应时,请真正查看html/text部分,因为您可能会发现页脚中的 JavaScript 的 JSON 已准备好进行解析。


小智 6

我使用pyuser_agent。该包使用获取用户代理。

import pyuser_agent
import requests

ua = pyuser_agent.UA()

headers = {
      "User-Agent" : ua.random
}
print(headers)

uri = "https://github.com/THAVASIGTI/"
res = requests.request("GET",uri,headers=headers)
print(res)
Run Code Online (Sandbox Code Playgroud)

控制台输出

{'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533+ (KHTML, like Gecko)'}
<Response [200]>
Run Code Online (Sandbox Code Playgroud)

  • 我认为你应该透露你是你在这里推广的软件的作者。 (13认同)

Fed*_*Baù 5

回答

您需要使用正确格式的用户代理字符串创建标头。它用于客户端与服务器之间的通信。

您可以在此处查看您自己的用户代理。

例子

Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0
Run Code Online (Sandbox Code Playgroud)

第三方包user_agent 0.1.9

我发现这个模块使用起来非常简单,在一行代码中它随机生成一个用户代理字符串。

from user_agent import generate_user_agent, generate_navigator
from pprint import pprint

print(generate_user_agent())
# 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.3; Win64; x64)'

print(generate_user_agent(os=('mac', 'linux')))
# 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:36.0) Gecko/20100101 Firefox/36.0'

pprint(generate_navigator())

# {'app_code_name': 'Mozilla',
#  'app_name': 'Netscape',
#  'appversion': '5.0',
#  'name': 'firefox',
#  'os': 'linux',
#  'oscpu': 'Linux i686 on x86_64',
#  'platform': 'Linux i686 on x86_64',
#  'user_agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686 on x86_64; rv:41.0) Gecko/20100101 Firefox/41.0',
#  'version': '41.0'}

pprint(generate_navigator_js())

# {'appCodeName': 'Mozilla',
#  'appName': 'Netscape',
#  'appVersion': '38.0',
#  'platform': 'MacIntel',
#  'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:38.0) Gecko/20100101 Firefox/38.0'}
Run Code Online (Sandbox Code Playgroud)