学习爬虫有一段时间了,对遇到的一些问题进行一下总结。
爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save)。
下面分别说下这几个过程中可以出现的问题:
你可以这样理解,你在浏览器输入xxjpg.com,告诉这个网站,我想看你的内容,然后网站服务器收到这个请求后,会分析这个请求是否是允许的,如果是,则返回内容给你的浏览器,以源码形式呈现。
可能存在的问题:
网络请求不成功
分析:
a.本地网络不稳定
b.网站本身服务器问题(维护,升级balabala...)
c.被封IP啦
针对网络请求可能出现的问题,建议都进行异常处理。因为俗话说的好,网络连接有风险,异常处理很重要。针对网络不好的情况,建议设置timeout。
被封IP的问题,建议使用IP代理池。免费的网上也有,不过稳定性不是很好,可以用来个人学习。如果爬取数据是商用,建议使用收费的。
二、获取网页响应
发送请求成功,服务器也正常得到了响应,我们就可以看下得到的源码了。
可能存在的问题:
1.无法正常显示中文或乱码
分析:编码的问题
修改编码encoding=‘utf-8’可以解决问题。当然,如果你用pycharm之类的IDE,如果IDE内没有正确设置encoding,同样会出现无 法显示中文的问题,不过这时候你就不单单是爬虫爬取网页不显示中文的问题,你所有运行的程序输出都不能正常显示中文。
2.返回的源代码为空
分析:
a. 网站请求失败了(参见本文第一个过程)
b. 网站采取了反爬虫手段(大部分是这个原因)
一些常见的网站反爬措施包括审查请求头,我遇到较多的是审查User-Agent(确定是否是浏览器的行为),Referer(防止图片盗链)的,最郁闷的一次是刚开始学爬虫的时候下载了几百张叮当猫(擦....)。这两种解决方法比较简单,在请求头中伪装一下就好。
有一些网站,如果爬虫爬取速度过快,会封IP。建议使用IP代理池,限制爬取速度。另外还有一些网站会对cookie进行审查,如果不需要登录就能爬取的网站,考虑禁止cookie。当然,还有些网站复杂点的,要求登录验证,可以采取多个账号登录,形成一个cookie池。不过值得注意的是,cookie都是有期限的。
还有一种网站会用的反爬手段,就是验证码。简单的字符识别,考虑用ocr。滑动验证,考虑用selenium模拟人的动作。再复杂点的验证,真正的人都很难看清的那种。作为一个python爬虫,是不应该怕这个的,迎难而上,解决这种验证码的方法,就是,就是,求助人工打码平台(捂头。。别打脸)。当然,有人会说了,这个复杂的验证码问题自己都不能解决,太水了。其实,万物都有两面性,简单的验证码,用户体验会更好,但是安全性相对来说差一些。复杂的验证码,就正好相反了。你是不是曾经有过这样的经历,看个网站让输验证码,输来输去都是错的,让人想砸键盘。所以说,万事无绝对,爬虫也是如此。
当然,对于爬取难度很高的网页,还有其他的迂回路线。比如,你这个www的网站真鸡儿难爬,我就找找m站啊,wap站啊。或者有没有PC端啊,或者app啊,说不定更简单呢。
三、解析
很重要的一个阶段,我们最终需要的数据都需要从这里面产生,什么文本啦,图片啦,音频啦...等等。
可能存在的问题:解析出来的内容为空
a.童鞋,你确定你正则表达式写对了么,我这里正则表达式18式,500块一本要不要
b.妹纸,你确定css选择器写对了么,我这里有css速成指南,免费送你要不要。。诶,别走啊
c.骚年,你确定xpath写对了么,我这里。。
。。。好了,开个玩笑,其实这些东西写错是很正常的,特别是在网页dom超级恶心复杂的时候,多尝试就好。
如果确定表达式写的没问题,那么可能是响应(response)的问题。
n.获取到网页源代码并没有包含需要提取的元素,网页是js动态加载的,而这些数据在动态加载的过程中生成
举个例子,刷微博的时候,看到某一条微博评论数上千,但是点进去查看评论只有几十条。把评论拉到最下面,过几秒,又加载了一部分出来。这就是一个动态加载的过程。针对这种情况在请求网页的时候加上响应的参数即可。可以使用chrome浏览器F12来查看参数,也可以使用firefox的firebug插件来查看。对于参数加密的,可以考虑强行破解或者selenium模拟的方式来突破。
四、保存
将解析出来的结构化数据存储到本地磁盘或者数据库。
可能存在的问题:各种异常
分析:主要涉及的是各种IO操作,包括文件读写和数据库操作,可能出现的问题也来自于这些。做好异常处理,再有问题,google。
好了,本次基本总结就到这里。不过这都是粗略的思路。具体实现限于篇幅也没法具体展开。以后有机会再具体补充。
原创文章,转载请注明出处,谢谢!
2018-06-15
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3爬虫爬取网页思路及常见问题(原创) - Python技术站