Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求不是';I don’我不会给我和我的浏览器一样的HTML_Python_Browser_Python Requests - Fatal编程技术网

Python请求不是';I don’我不会给我和我的浏览器一样的HTML

Python请求不是';I don’我不会给我和我的浏览器一样的HTML,python,browser,python-requests,Python,Browser,Python Requests,我正在使用Python请求抓取一个Wikia页面。不过,有一个问题:requests请求没有提供与我的浏览器相同的HTML,而我的浏览器使用的是同一个页面 为了进行比较,以及(下载它们以查看-抱歉,从另一个站点直观地托管一点HTML并不是一个简单的方法) 您将注意到一些差异()。有一些小事情,比如属性排序不同等等,但也有一些非常非常大的事情。最重要的是缺少最后六个以及整个导航和页脚部分。即使在原始HTML中,页面看起来也会突然被切断 为什么会发生这种情况,有没有办法解决?我已经想到了很多事情,但

我正在使用Python请求抓取一个Wikia页面。不过,有一个问题:requests请求没有提供与我的浏览器相同的HTML,而我的浏览器使用的是同一个页面

为了进行比较,以及(下载它们以查看-抱歉,从另一个站点直观地托管一点HTML并不是一个简单的方法)

您将注意到一些差异()。有一些小事情,比如属性排序不同等等,但也有一些非常非常大的事情。最重要的是缺少最后六个
以及整个导航和页脚部分。即使在原始HTML中,页面看起来也会突然被切断

为什么会发生这种情况,有没有办法解决?我已经想到了很多事情,但没有一件是卓有成效的:

  • 请求头干扰?没有,我尝试将浏览器发送的头文件,
    User-Agent
    和所有文件以1:1的比例复制到请求中,但没有任何更改
  • 加载HTML后是否加载JavaScript内容?不。即使禁用了JS,Firefox也给了我一个“好”页面
  • 嗯。。。好。。。还有什么呢

如果你知道一种可能发生这种情况的方法和修复它的方法,那就太神奇了。谢谢大家!

我看到的许多不同之处告诉我,内容仍然存在,只是呈现顺序不同,有时间距不同

您可能会收到基于多个不同内容的不同内容:

  • 你的标题
  • 您的用户代理
  • 时间到了
  • web应用程序决定在页面上呈现元素的顺序,取决于随机属性顺序,因为元素可能从未排序的数据源中提取
如果你能把你所有的标题都放在这个差异的顶部,那么我们就可以更好地理解它

我怀疑应用程序选择不渲染某些图像,因为它们没有针对它认为的某种机器人/移动设备(Python请求)进行优化


仔细查看差异,似乎所有内容都加载到了两个请求中,只是格式不同。

我建议您在发送请求时没有发送正确的标题(或发送错误)。这就是为什么你会得到不同的内容。以下是带有标头的HTTP请求的示例:

url = 'https://www.google.co.il/search?q=eminem+twitter'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'

# header variable
headers = { 'User-Agent' : user_agent }

# creating request
req = urllib2.Request(url, None, headers)

# getting html
html = urllib2.urlopen(req).read()
如果您确定发送的标题是正确的,但仍然得到不同的html。你可以尝试使用。它将允许您直接使用浏览器(如果您的机器没有GUI,也可以使用)。使用selenium,您可以直接从浏览器中获取html。

我遇到了类似的问题:

  • 与Python相同的标题,并通过浏览器显示
  • JavaScript肯定被排除在原因之外
为了解决这个问题,我最终将请求库替换为urllib.request

基本上,我替换了:

import requests

session = requests.Session()
r = session.get(URL)
与:

然后它成功了


也许其中一个图书馆在幕后做了一些奇怪的事情?不确定这是否是您的选择。

在请求页面时,我遇到了类似的问题。然后我注意到我正在使用的URL要求在URL前面加上“http”,但我在前面加了“https”。我的请求URL看起来像。所以,让URL看起来像。希望它能解决这个问题。

也许请求和浏览器使用不同的方式从WEB服务器呈现原始数据,而上面示例中的差异仅与呈现的html有关

我发现当html被破坏时,不同的浏览器,例如Chrome和Safari,在解析时使用不同的方法来修复。因此,请求和Firefox的想法可能是一样的

对于请求和Firefox,我建议区分原始数据,即套接字中的字节流。请求可以使用响应对象的.raw属性来获取套接字中的原始数据。()如果双方的原始数据相同,并且HTML中存在一些损坏的代码,可能是由于解析损坏的HTML时请求和浏览器的自动修复策略不同

(也许我最近的经验会有所帮助)

我在Amazon上面临同样的问题:我的本地机器能够处理所有页面,但当我在Google云实例上移动项目时,我正在抓取的一些项目的行为发生了变化

以前的实施 在我的本地机器上,我使用的请求库如下

page = requests.get(url_page, headers=self.headers)
page=page.content
基于本地浏览器,在我的类中指定标题

headers = {
    "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 OPR/67.0.3575.137"}
但是我在谷歌云实例上使用这个设置得到了不完整的页面

新实施 以下实现涉及不带标头的urllib

req = urllib.request.Request(
                    url_page,
                    data=None
                )
f = urllib.request.urlopen(req)
page = f.read().decode('utf-8')
self.page = page
此解决方案在两台机器上都有效;在这次尝试之前,我还尝试使用相同的头,但问题没有解决,因此我假设问题存在,就删除了头(可能是因为我错误地识别为另一个客户机)

因此,我的代码工作得很好,我仍然能够使用beautifulsoup处理页面的内容,正如我在类中实现的以下方法,以便从页面的特定部分提取文本

 def find_data(self, div_id):
    soup = BeautifulSoup(self.page, features = "lxml")
    text = soup.select("#"+div_id)[0].get_text()

    text = text.strip()
    text = str(text)
    text = text.replace('"', "")
    return text

服务器可以根据您的心情、月相以及最重要的是您的请求所包含的标题,免费为您提供任何服务。Firefox发送的头不同于
请求
。此外,还有用户代理、通过JavaScript加载的内容等。然而,这不是
请求
错误。这是服务器的选择。您可以在Firefox的
请求
代码中试验和复制标题;常见的罪魁祸首是cookie、用户代理头和Accept*系列头;它解析接收到的HTML并运行JavaScript代码(如果有)。解析HTML意味着插入缺少的隐含元素(如
到表中)并修复任何不可用的内容
 def find_data(self, div_id):
    soup = BeautifulSoup(self.page, features = "lxml")
    text = soup.select("#"+div_id)[0].get_text()

    text = text.strip()
    text = str(text)
    text = text.replace('"', "")
    return text