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


127

我想从下面的网站获取内容。如果使用Firefox或Chrome这样的浏览器,则可以获取所需的真实网站页面,但是如果使用Python request软件包(或wget命令)进行获取,则它将返回完全不同的HTML页面。我以为网站的开发人员为此做了一些阻碍,所以问题是:

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

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

Answers:


281

提供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)

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


附带说明一下,有一个非常有用的第三方程序包,称为fake-useragent,它在用户代理上提供了一个不错的抽象层:

假用户代理

最新的简单useragent伪造者与实际数据库

演示:

>>> 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 2014年

8
@ user1726366:您不能简单地添加JavaScript支持-为此,您需要一个JavaScript解释器。最简单的方法是使用真实Web浏览器的JavaScript解释器,但是您可以使用Selenium从Python自动化它。
下午14年

1
@ alecxe,@ sputnick:我试图用wireshark捕获数据包以比较使用python请求和浏览器的区别,似乎网站URL不是一个静态的URL,我必须等待页面渲染完成,所以Selenium听起来适合我的工具。谢谢你的热心帮助。:)
user1726366 2014年

4
@ user1726366是的,如果使用真正的浏览器+硒符合您的需求,那么这是最轻松的方法。请注意,您可以将PhantomJS无头浏览器与硒一起使用。谢谢。(如果有帮助,别忘了接受答案)
alecxe 2014年

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 '18

1
404是另一个错误,您确定能够使用浏览器浏览页面吗?
Umesh Kaushik

绝对。我觉得我尝试使用的网站阻止了所有Amazon EC2 IP。
Maksim Kniazev,

您能在这里ping链接吗?我可以尽力而为。此外,如果IP被阻止,则错误代码应为403(禁止)或401(未经授权)。有些网站根本不允许抓取。另外,许多网站用户使用cloudflare来避免漫游器访问网站。
Umesh Kaushik '18

这是我的链接regalbloodline.com/music/eminem。以前效果很好。停止在python 2上工作。在本地计算机上的python 3上工作。移至AWS EC2在那里不起作用。继续出现错误404。然后也停止在本地计算机上工作。使用浏览器仿真只能在本地计算机上使用,而不能在EC2上使用。最后,我放弃了,找到了其他网站来抓取。顺便说一句,可以避免cloudfire吗?
Maksim Kniazev '18

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)

用法:

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

3

答案的根源是,提出问题的人需要有一个JavaScript解释器才能获得所要查找的内容。我发现我可以在JSON网站上获取想要的所有信息,然后再用JavaScript对其进行解释。这为我节省了很多时间来解析html,希望每个网页都采用相同的格式。

因此,当您从网站收到使用请求的响应时,请真正查看html / text,因为您可能会在页脚中找到可解析的javascripts JSON。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.