看着女神微博,总觉得女神微博的哪一张照片都好看,于是想用脚本把她微博相册中的微博配图全部抓下来。
一开始打开微博配图网页,打开开发者工具,查看网页源代码。其后,我直接右键查看网页源代码,发现网页源代码和开发者工具下看见的不一样,其中应该是浏览器加载了js,开发者工具看到了更多。因为爬虫的话,首选移动端,于是我打开移动端网页查看,这里面两者就是一样的。但是移动版照片好小,但是通过和网页版的比较,发现图片的地址有一定的关系,地址栏uuid一样,这就好办多了。
分析完,剩下的就是编码实现了,虽然学过Ruby,但是听说爬虫还是选择Python比较好,于是一边看语法,一边写代码。下面是源代码,其中技术实现分为主要三点:
1.登录。这里我直接用浏览器的Cookie登录,没有提交表单,省了不少代码,而且模拟表单登录,过一段时间可能不适用了,因为新浪会修改接口。其中把User-Agent参数带上,否则403。
2.爬取移动版图片uuid拼凑出网页版大图片地址,其中移动版小图片没有logo,大图片的logo没有找到好的去除方式。
3.下载图片到本地。
import urllib2 #2.7版本
import re
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
'cookie': ''} #输入您的Cookie 在chrome浏览器请求网页时可以看到好长的字符串</span>
count = 0
page = 27 #微博相册页数,此处可以做优化,从1开始爬,直到没有。但是我为了按照时间来爬,就简单粗暴地处理了。
while page > 0:
req = urllib2.Request('http://weibo.cn/album/albummblog/?rl=11&fuid=3261134763&page='+ str(page), headers=headers)
r = urllib2.urlopen(req)
data = r.read()
p = re.compile(r'src="http://ww(.).sinaimg.cn/square/(.{32}).jpg" alt=')
uuids = p.findall(data)
urls = []
for uuid in uuids:
url = 'http://ww' + uuid[0] + '.sinaimg.cn/mw1024/' + uuid[1] + '.jpg'
urls.append(url)
urls.reverse()
for url in urls:
response = requests.get(url)
if response.status_code == 200:
count += 1
f = open("/home/chen/mytest/crystal/"+ str(count) +".jpg", 'wb')
f.write(response.content)
f.close()
page -= 1
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最后,我想说,Python的代码书写格式我一开始还真没注意==</span>