urllib2和scrapy的302redirect错误

今天用爬虫爬csdn的blog的时候,发现会产生302重定向的问题,并且,重定向的url仍然是原来的url,这样就会产生一个infinite loop,让爬虫无法工作。下面说一下解决的方法:

##urllib2的错误

代码:
#encoding=utf-8

import urllib
import urllib2

response = urllib2.urlopen(url)
print response.read()

运行上面的代码会产生下面的错误,爬虫会退出

######urllib2.HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.#The last 30x error message was:Moved Temporarily####
避免这个问题的方法就是在代码中加入对cookie的处理,下面是改正后的代码:

代码:
#encoding=utf-8

import urllib
import cookielib, urllib2

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
headers = {
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
    }
request = urllib2.Request(
    url = '************',
    headers = headers
    )
response = opener.open(request)
print response.read()

代码中同时修改了headers来模仿浏览器登陆,如果只cookie处理部分的代码会出现403forbidden的错误。

##使用scrapy的修改方法
其实使用scrapy本不应该出现这个问题的,因为scrapy自带对cookie的处理,那这个问题是如何产生的呢?
scrapy中文文档中的避免被禁止(ban)这一节讲过

禁止cookies(参考 COOKIES_ENABLED),有些站点会使用cookies来发现爬虫的轨迹

所以在一些代码中会采取这个策略,在setting.py中将COOKIES_ENABLED设置为False,也就是禁止scrapy来处理cookie,这在大部分网站下可能都是可用的,但很难说会遇到今天这样的问题,必须要处理cookie,说到这里大家应该都明白了,正确的处理方法就是在setting.py中将COOKIES_ENABLED的值改为True,即:

COOKIES_ENABLED = True