Python爬虫:动态网页抓取淘宝“淘女郎”照片

时间:2023-02-07 05:05:10

Python爬虫

作为一个搞数据的人,不会点爬虫真是说不过去。以前曾搞过那么几天,早就忘了,借着一个项目需要抓取点东西便再捡回来了。本篇将介绍使用python, urllib2, re, spynner 抓取淘宝淘女郎的所有写真照片。来个网址:https://mm.taobao.com 让我们先对淘女郎有个直观的感受嘛。

主要步骤:

1. 抓取  http://mm.taobao.com/json/request_top_list.htm  的淘女郎信息,如:主页url, 用户ID,年龄等等信息。对进一步抓取有用的信息是主页的url用户ID。 仔细观察会发现,主页的url里面包含了用户ID。这个信息将为我们后面提供了大大的方便。
2. 通过 用户ID 分析得到该用户相册列表的url,然后抓取用户所有相册的url。 3. 通过 相册的url 分析得到该相册照片列表的url,然后就随心所欲的抓取这些照片吧。

思路分析:

三个步骤说来简单,其中的痛苦挣扎只有自己才知道呢。特别是当发现,相册那个网页是动态生成的时候。以前只抓取过静态页面的信息,那天发现urllib2抓取的信息怎么不全的时候我就犯愁了。在Chrome浏览器里F12调出来的调试页面,我能在element里面看到我想要抓取的链接,而在source里却没有,而urllib2只能得到source里的内容,所以死活就是没有我要的连接。这说明这个网页是动态生成的,urllib2无法抓取动态网页的信息。于是昨晚折腾了下spynner这个python的库。 “spynner是一个QtWebKit的客户端,它可以模拟浏览器,完成加载页面、引发事件、填写表单等操作。”
动态网页是在浏览器浏览网页的时候实时从数据库调取数据再加载的,那么只要我们模拟浏览器的操作,那么就通过分析加载完毕的页面得到那些动态加载的链接了。
安装spynner倒是容易直接pip就ok,安装qt和pyqt,sip这些支持库的时候却蛋疼了我一晚上。这儿我就不详细说如何安装了,有安装问题欢迎留言。 糟糕的spynner文档,导致一个load的超时问题就逼的我去看源码。如果哪位朋友有好的spynner文档欢迎分享。 下面是我动态网页信息的代码:
    def get_albums_url_dy(self, url):
browser = spynner.Browser()
browser.hide()
try:
resp = browser.load(url)
except spynner.SpynnerTimeout:
browser.wait_load()
page = browser.html.encode('utf-8')
pattern = re.compile('<a href=".*?(album_id=\d*).*?"')
items = re.findall(pattern, page)
#delete repeats
urls = []
album_ids = []
for i in items:
if i not in album_ids:
album_ids.append(i)
for i in album_ids:
urls.append('//mm.taobao.com/self/album_photo.htm?user_id=687471686&'+ i)

return urls
通过spynner模拟浏览器的行为确实可以让我们抓取到那些动态加载的链接,但由于模拟了整个浏览器的加载行为,所以效率是极其的低下。举个例子,由于MM相册url加载的时候超过了spynner的load的10s限制,导致最初调试的时候一直报错,后来加上了try, except和wait_load()算是解决了这个问题。打开这样一个链接加载时间就在10s左右,要抓取如此多的图片用这个方法得等到淘宝关闭都抓取不完吧。

于是换种思路。 既然动态加载页面那一定也是一个连接,连接到淘宝的某个json格式的列表,就和花里胡哨的淘女郎主页那个链接也被:http://mm.taobao.com/json/request_top_list.htm 轻松替代一样。我们是不是也能找到对应某个淘女郎相册的json列表,那样就容易了。于是乎,基于这个想法我再次在Chrome浏览器里按下了F12。呵呵哒。通过在淘女郎相册里换页时,F12里network的显示: Python爬虫:动态网页抓取淘宝“淘女郎”照片

我们成功从一堆杂乱的连接里成功的找到这个打开相册的关键链接! 打开它我们看到:
Python爬虫:动态网页抓取淘宝“淘女郎”照片 啊哈,这不就我们想要的嘛。通过遍历所有page我们就可以通过对这个静态页面的分析得到所有相册的url了。
进入相册后,如何找到所有照片的步骤和上面差不多。只要手动分析到json的列表就万事大吉了。

下面上效果图: Python爬虫:动态网页抓取淘宝“淘女郎”照片
Python爬虫:动态网页抓取淘宝“淘女郎”照片


所有代码我已上传到csdn资源站了:http://download.csdn.net/detail/u013787595/9199403
欢迎大家指点。

经验总结:

1. Windows文件夹不能含有"."等特殊符号,一定要在创建文件夹的时候删除这些特殊字符,不然在保存照片的时候就会报错(因为找不到文件夹啦) 2. 页面手动分析的时候注意换行和空格的正则匹配。有时候需要多匹配多个才能得到需要的字符串。 3. 活用F12哦!

展望未来:

现在有时候会因为网络问题导致下载中断,那么难道我们就要重新下载一遍?现在看来我们只能通过更改start和end的index来跳过下载过的。我会继续更新代码增加新的功能,比如对线程下载等。
原文发于博客http://blog.csdn.net/u013787595
GMX 2015.10.20  US  Pacific Time