今天用爬虫爬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