学习爬虫有一段时间了,对遇到的一些问题进行一下总结。

  爬虫流程可大致分为:请求网页(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