拿到一个网站以后就是先分析网站,分析以后发现须要的数据要登录才能看到.这个可难不倒我,不就是模拟登录吗,小菜一碟.
用chrome分析一下,看到有用户名,密码,还有其余两个校验值.另外还有一个重定向的callback值.以下:python
<input type="hidden" name="callback" id="callback" value="此处是重定向的连接">
接下来就登录,观察post请求的状况.由于有上面的那行代码,因此跳转太快,没看到post请求状况,删掉上面那行代码,而后请求,此次看到了表单发送信息.chrome
接下来就是写代码,模拟登录.很快就写好代码了,而后开始测试.(还记的上面说过的哪两个校验值吗? 这两个值都是动态的,能够用正则从登录页面提取到).cookie
部分代码以下:dom
name = "form" download_delay = 0.18 allowed_domains = ["http://www.xxxxxx.com"] headers = { "Accept":"*/*", "Accept-Encoding":"gzip, deflate, sdch", "Accept-Language":"zh-CN,zh;q=0.8", "Cache-Control":"max-age=0", "Connection":"keep-alive", "Host": "www.xxxxxx.com", "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" } def start_requests(self): return [scrapy.Request("http://www.xxxxxxx.com/user/login",meta={'cookiejar':1},headers=self.headers, callback=self.post_login)] def post_login(self, response): # 下面这句话用于抓取请求网页后返回网页中的_xsrf字段的文字, 用于成功提交表单 protected_code = Selector(response).xpath('//label[@class="rem"]/input[@name="protected_code"]/@value').extract()[0] matchObj=re.search(r'\"csrftk\":\"(.*)\",\"img_path\"',response.text) csrf_tk=matchObj.group(1) logging.log(logging.WARNING, u"正则获取的值----"+csrf_tk) # FormRequeset.from_response是Scrapy提供的一个函数, 用于post表单 # 登录成功后, 会调用after_login回调函数 return [scrapy.FormRequest.from_response(response,method="POST", headers=self.headers, # 注意此处的headers formdata={ 'protected_code': protected_code, 'email': 'xxxxxx@qq.com', 'csrf_tk': csrf_tk, 'password': 'xxxxxxxxxx', 'remember': 'true', }, meta={'cookiejar': response.meta['cookiejar']}, callback=self.after_login, dont_filter=True )]
而后设置COOKIES_ENABLED = True和COOKIES_DEBUG=True进行测试.结果发现不成功.查看日志,发现cookie仍是登录以前的状态,登录的那边被302定向了.(如今想来,应该是scrapy重定向的时候,带的仍是登录前的cookie,因此之后的状态仍是登陆前的).scrapy
既然如此,那就试试关闭重定向,REDIRECT_ENABLED = False,然测试一下,发现爬虫直接退出了.根据报错信息上网找答案,HTTPERROR_ALLOWED_CODES = 302, 而后在跑一遍,完美解决.拿到了想要的数据.到这个时候已经花了好几个小时了.中间走了好多弯路.函数
总结:遇到错误要认真分析错误信息,多尝试.头脑要清晰,有耐心.技术上的,对scrapy理解的仍是不足,对cookies和重定向的理解不到位.理解了运行原理,解决问题就简单多了.post
REDIRECT_ENABLED = False 关掉重定向,不会重定向到新的地址 HTTPERROR_ALLOWED_CODES = [302,] 返回302时,按正常返回对待,能够正常写入cookie
顺便谈一下,python在解决实际问题的时候仍是很实用的,能够快速上手,并且有很丰富的开源库.建议有时间能够去学一下测试