lazybios

Sina微博相册小爬虫

很早以前就想写个爬虫程序体验下,总是停留到想的层面里,没有落实(执行力差),这次写了一个爬去sina微博相册的小爬虫,算是开了个头吧,当然小爬虫嘛,线程之类统统没有,下一步再向多线程爬虫进军吧。

运行环境

python 2.7.3+

wget命令

lxml辅助包(用于解析html的)

下载地址:

windows 二进制包 下载

爬虫思路

因为sina微博不容许在没有登录的情况下访问其它用户信息,所以第一步首先要模拟sina微博登陆,也就是取得cookies,然后在每一次的请求交互中发送cookies信息得到服务端的验证,进而可以随意访问服务端的网页信息,做完了第一步之后就要就要访问到指定的url路径去取得网页的源码信息,找规律找出要下载图片的文件名,进一步拼凑出图片的服务端的存放路径,最后通过wget命令windows下写一个.bat的批处理,linux下写一个.sh的脚本实现自动下载图片到指定路径。提炼之后就是:

  1. 模拟登录sina

  2. 提取目标页面的关键信息

  3. 生成批处理脚本文件实现下载

实现细节

细节1 模拟登录sina

模拟登录sina weibo.com的困难还是不小的,因为页面中有很多的js操作,特别是他通过异步加载的方法显示一些内容,所以单纯性的查看请求返回的源代码是看不到一些关键信息的,只有在浏览器中执行js脚本它才会显示,所以必须通过http协议分析软件对登录过程进行抓包分析后,才能找到关键请求地址和登录时post信息,这样的工具有很多,推荐httpwatch,这个软件对http协议的分析是很全面的,当然使用firefox的firedebug中查看网络之类的开发者工具也能起到同样效果,具体需要的知识就是html表单及http协议基本知识 经过的实际操作,发现模拟登录 weibo.com是基本上短期内不可以实现的,因为post时密码之类的信息是随机生成的,如果你不知道sina是怎么生成的,是根本不可能生成对的,在网上搜所相关信息时找到一篇登录成功的文章(地址这里),原理上没有一点问题,但是设计登录获取随机值的js已经升级为(v1.4.18),所以一些获取参数的方法并不适用了。闹心了一阵子后,网上找到了一个很取巧的方法就是,登录手机版 sina 微博,weibo.cn,因为是手机js自然少,前密码干脆是明文的省去了好多麻烦,所以登录顺利解决,python语言部分要涉及到第三方库lxml来解析html源文件,以及urllib2进行网络请求操作

细节2 正则获取文件名等信息

正则部分本身不难,但最好子做之前对目标区域做个裁剪以达到最小化有用区域,从而排除干扰信息,还有就是要要注意贪婪匹配的问题,python中正则的使用到re模块,详细操作可以单独查看网上相关python正则文章,此处不详述了

细节3 wget命令使用

wget -O 文件名 URL 下载并重命名

wget -P 存放路径 URL 下载到指定的路径下

细节4 分页问题

因为网页中存在分页机制,所以为了最大化自动操作,我在设计时先对带爬取首页进行一次抽取分页总数的操作,这样的话不可必灭的要访问一次,之后通过for循环根据路径规律来访问没一页并抽取出文件名称同时拼凑出目标图片存放路径放到list中,这样灵活性是增大了,但是却多访问了一次初始页面,但如果减少访问次数,那就需要多写几行带代码,这样的话代码的抽象度就不高了,对于这种问题我也不知道怎么取取舍,所以姑且先择了少写几行代码

以上就是写爬虫的过程中遇到的一些问题,当然其实还有一些pyton和IDE的问题,我想那应该不属于这篇文章的范畴,所以打算单独写一篇来作为积累笔记,下面给出效果图片,会动的呦! ps:github上先不上传代码,等12/31号实训审核通过后贴出来

代码地址

效果图链接:猛点这里!

微信关注「日拱一卒」公众号