Python服务器检测中的网站抓取

Python服务器检测中的网站抓取,python,web-scraping,socket-timeout-exception,Python,Web Scraping,Socket Timeout Exception,我在网上浏览某个网站时遇到了一个有趣的现象。使用Python的urllib2(Python 2.7)时会出现问题。例如: import urllib2 LINK = "http://www.sample.com/article/1" HEADERS = {'User-Agent': 'Mozilla5.0/...'} # Ellipsis for brevity req = urllib2.Request(link, data=None, headers=HEADERS) resp =

我在网上浏览某个网站时遇到了一个有趣的现象。使用Python的urllib2(Python 2.7)时会出现问题。例如:

import urllib2

LINK = "http://www.sample.com/article/1"

HEADERS = {'User-Agent': 'Mozilla5.0/...'} # Ellipsis for brevity 

req = urllib2.Request(link, data=None, headers=HEADERS)
resp = urllib2.urlopen(req, timeout=20).read()
以下是奇怪的结果:

1) 当一个有效的用户代理被传递到请求头时,服务器将返回状态200和一个页面,说明处理请求时出现问题(无效html)。这意味着我能够从数据损坏的服务器获得成功的响应

2) 当传递无效的用户代理(空头{})时,服务器将超时。但是,如果超时设置为较大的值(本例中为20秒),则服务器将以缓慢的方式返回有效数据


当服务器上没有以前的请求时,就会出现这个问题,因此我相信服务器可能希望请求中的某个cookie提供有效数据。有人知道为什么会这样吗

您无法知道服务器端发生了什么。

你可以继续做实验,猜测它在另一边是如何工作的。如果这只是一个用户代理的问题-只需继续发送它(可能会在一段时间内更改一次)为您的所有请求,包括第一个请求


另外,我会在一个新的会话(匿名)上打开chrome开发工具,记录你正在做的所有动作,这样你可以看到真实浏览器发出的请求的结构。

你不知道服务器端发生了什么。

你可以继续做实验,猜测它在另一边是如何工作的。如果这只是一个用户代理的问题-只需继续发送它(可能会在一段时间内更改一次)为您的所有请求,包括第一个请求


另外,我会在一个新的会话(匿名)上打开chrome dev工具,记录你正在做的所有动作,这样你就可以看到真实浏览器发出的请求的结构。

我同意实验是一种方法,但是这不就是服务器的倒退行为吗?urllib2中的默认用户代理表示Python,此时服务器发送有效数据(尽管速度非常慢)。不知何故,检测到伪造的用户代理,并返回包含无效数据的200状态。我不能把我的心思放在这个上面!有很多旧的ASP/PHP/不推荐使用的框架出于很多原因使用用户代理。不要试图理解这一点,只要检查你真正的浏览器做什么,并试着模仿它。我同意实验是一种方法,但是这看起来不是服务器的倒退行为吗?urllib2中的默认用户代理表示Python,此时服务器发送有效数据(尽管速度非常慢)。不知何故,检测到伪造的用户代理,并返回包含无效数据的200状态。我不能把我的心思放在这个上面!有很多旧的ASP/PHP/不推荐使用的框架出于很多原因使用用户代理。不要试图理解这一点,只要检查你真正的浏览器做什么,并尝试模仿它。