本篇目标
抓取淘宝MM的姓名,头像,年龄
抓取每一个MM的资料简介以及写真图片
把每一个MM的写真图片按照文件夹保存到本地
熟悉文件保存的过程
1. URL的格式
在这里我们用到的URL是 http://mm.taobao.com/json/request_top_list.htm?page=1,问号前面是基地址,后面的参数page是代表第几页,可以随意更换地址。点击开之后,会发现有一些淘宝MM的简介,并附有超链接链接到个人详情页面。
我们需要抓取本页面的头像地址,MM姓名,MM年龄,MM居住地,以及MM的个人详情页面地址。
2.抓取简要信息
相信大家经过上几次的实战,对抓取和提取页面的地址已经非常熟悉了,这里没有什么难度了,我们首先抓取本页面的MM详情页面地址,姓名,年龄等等的信息打印出来,直接贴代码如下
Python
__author__ = 'CQC'
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
class Spider:
def __init__(self):
self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm'
def getPage(self,pageIndex):
url = self.siteURL + "?page=" + str(pageIndex)
print url
request = urllib2.Request(url)
response = urllib2.urlopen(request)
return response.read().decode('gbk')
def getContents(self,pageIndex):
page = self.getPage(pageIndex)
pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S)
items = re.findall(pattern,page)
for item in items:
print item[0],item[1],item[2],item[3],item[4]
spider = Spider()
spider.getContents(1)
编译会产生编码错误:
Traceback (most recent call last):
File "gettaobaogirl.py", line 29, in <module>
spider.getContents(1)
File "gettaobaogirl.py", line 22, in getContents
print page
UnicodeEncodeError: 'ascii' codec can't encode characters in position 468-470: ordinal not in range(128)
搜索查询可知,是因为我们python默认的编码是’ascii’,当遇到html里面不是这种编码的字符时,就会产生问题。
需要修改编码格式,修改后代码如下
__AUTHOR__ ="CQC"
#coding = utf-8
import urllib
import urllib2
import re
# 修复编码问题
import sys
class Spider:
def __init__(self):
self.siteURL = "http://mm.taobao.com/json/request_top_list.htm"
# 修复编码问题
reload(sys)
sys.setdefaultencoding("utf-8")
def getPage(self,pageIndex):
url = self.siteURL + "?page="+str(pageIndex)
print url
request = urllib2.Request(url)
response = urllib2.urlopen(request)
return response.read().decode('gbk')
def getContents(self,pageIndex):
page = self.getPage(pageIndex)
pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S)
items = re.findall(pattern,page)
for item in items:
print item[0],item[1],item[2],item[3],item[4]
spider = Spider()
spider.getContents(1)
正确结果: