博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scrapy爬取某网站,模拟登陆过程中遇到的那些坑
阅读量:6276 次
发布时间:2019-06-22

本文共 2787 字,大约阅读时间需要 9 分钟。

hot3.png

    拿到一个网站之后就是先分析网站,分析之后发现需要的数据要登陆才能看到.这个可难不倒我,不就是模拟登陆吗,小菜一碟.

    用chrome分析一下,看到有用户名,密码,还有其他两个校验值.另外还有一个重定向的callback值.如下:

接下来就登陆,观察post请求的情况.因为有上面的那行代码,所以跳转太快,没看到post请求情况,删掉上面那行代码,然后请求,这次看到了表单发送信息.

接下来就是写代码,模拟登陆.很快就写好代码了,然后开始测试.(还记的上面说过的哪两个校验值吗? 这两个值都是动态的,可以用正则从登陆页面提取到).

部分代码如下:

name = "form"download_delay = 0.18allowed_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,所以以后的状态还是登录前的).

既然如此,那就试试关闭重定向,REDIRECT_ENABLED = False,然测试一下,发现爬虫直接退出了.根据报错信息上网找答案,HTTPERROR_ALLOWED_CODES = 然后在跑一遍,完美解决.拿到了想要的数据.到这个时候已经花了好几个小时了.中间走了好多弯路.

总结:遇到错误要认真分析错误信息,多尝试.头脑要清晰,有耐心.技术上的,对scrapy理解的还是不足,对cookies和重定向的理解不到位.理解了运行原理,解决问题就简单多了.

REDIRECT_ENABLED = False 关掉重定向,不会重定向到新的地址HTTPERROR_ALLOWED_CODES = [302,] 返回302时,按正常返回对待,可以正常写入cookie

顺便谈一下,python在解决实际问题的时候还是很实用的,可以快速上手,而且有很丰富的开源库.建议有时间可以去学一下

转载于:https://my.oschina.net/airship/blog/1795370

你可能感兴趣的文章
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
Android下创建一个sqlite数据库
查看>>
数组<=>xml 相互转换
查看>>
MFC单文档应用程序显示图像
查看>>
poj 2777(线段树的节点更新策略)
查看>>
Swift-EasingAnimation
查看>>