我想从这个网站获取内容。
如果我使用像 Firefox 或 Chrome 这样的浏览器,我可以获得我想要的真实网站页面,但如果我使用 Python Requests 包(或
wget
命令)来获取它,它会返回一个完全不同的 HTML 页面。
我以为网站开发者为此做了一些屏蔽。
如何使用 python 请求或命令 wget 来伪造浏览器访问?
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,它在用户代理上提供了一个很好的抽象层:
假用户代理
带有真实世界数据库的最新简单用户代理伪造者
演示:
>>> 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'
我使用了假UserAgent。
安装:
pip install fake-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]>
还提供其他功能。随机返回仅 Edge 或 Chrome 浏览器的用户代理:
from fake_useragent import UserAgent
ua = UserAgent(browsers=['edge', 'chrome'])
ua.random
仅随机返回 Linux 操作系统用户代理字符串:
from fake_useragent import UserAgent
ua = UserAgent(os='linux')
ua.random
或者随机返回最小使用百分比为 1.3% 或更高的用户代理字符串:
from fake_useragent import UserAgent
ua = UserAgent(min_percentage=1.3)
ua.random
尝试这样做,使用 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"
答案的根源是提出问题的人需要有一个 JavaScript 解释器才能得到他们想要的东西。我发现我能够在 JavaScript 解释之前在网站上以 json 形式获取我想要的所有信息。这为我节省了大量的时间来解析 html,希望每个网页都采用相同的格式。
因此,当您使用请求从网站获得响应时,请真正查看 html/文本,因为您可能会发现页脚中的 javascript JSON 已准备好进行解析。
我使用pyuser_agent。这个包使用获取用户agnet
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)
控制台输出
{'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533+ (KHTML, like Gecko)'}
<Response [200]>
您需要创建一个具有正确格式的用户代理字符串的标头,它是用于客户端与服务器之间通信的服务器。
您可以检查您自己的用户代理这里。
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
我发现这个模块使用起来非常简单,在一行代码中它会随机生成一个用户代理字符串。
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'}
用户代理没问题,但他想获取 JavaScript 站点。我们可以使用 selenium,但设置和维护很烦人,因此获取 JavaScript 渲染页面的最佳方法是 requests_html 模块。这是众所周知的请求模块的超集。要安装使用 pip
pip install requests-html
要获取 JavaScript 渲染的页面,请使用
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://python.org/')
希望能有所帮助。它使用 pupter 来渲染 javascript,并且还下载 chromium,但您不必担心一切都在幕后发生。您将得到最终结果。
我有类似的问题,但我无法使用
UserAgent
模块内的 fake_useragent
类。我在 docker 容器内运行代码
import requests
import ujson
import random
response = requests.get('https://fake-useragent.herokuapp.com/browsers/0.1.11')
agents_dictionary = ujson.loads(response.text)
random_browser_number = str(random.randint(0, len(agents_dictionary['randomize'])))
random_browser = agents_dictionary['randomize'][random_browser_number]
user_agents_list = agents_dictionary['browsers'][random_browser]
user_agent = user_agents_list[random.randint(0, len(user_agents_list)-1)]
我瞄准了模块中使用的端点。这个解决方案仍然给了我一个随机的用户代理,但是端点的数据结构可能会改变。
就是这样,我一直在使用近 1000 个假用户代理列表中的随机用户代理
from random_user_agent.user_agent import UserAgent
from random_user_agent.params import SoftwareName, OperatingSystem
software_names = [SoftwareName.ANDROID.value]
operating_systems = [OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value, OperatingSystem.MAC.value]
user_agent_rotator = UserAgent(software_names=software_names, operating_systems=operating_systems, limit=1000)
# Get list of user agents.
user_agents = user_agent_rotator.get_user_agents()
user_agent_random = user_agent_rotator.get_random_user_agent()
示例
print(user_agent_random)
Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/87.0.4280.88 Safari/537.36
欲了解更多详情,请访问此链接