Python爬虫学习(七)爬取淘女郎


今天,想用一个实例说明一些关于Ajax
的知识,至于例子嘛,就是爬取淘女郎。地址:https://mm.taobao.com/search_tstar_model.htm?spm=5679.126488.640745.2.b17c0adI6uE72
话不多说,直接开车!
分析美人库页面
首先,我们来到https://mm.taobao.com/search_tstar_model.htm?spm=5679.126488.640745.2.b17c0adI6uE72,查看源代码:

然后,我们随便查看一个美女的首页,比如:

地址为:https://mm.taobao.com/self/aiShow.htm?spm=719.7763510.1998643336.36.qMzWeX&userId=143534224
按照我们之前的爬取经验,这个地址应该能够从一开始的页面找到,毕竟是从那跳转过来的,于是,我们在页面源码中查找:

竟然没有?!不论怎么查找,都找不到。这是什么情况?
答案是Ajax
。
我们用Chrome的开发者工具查看一下,或许能找到答案。

从图中,我们可以看到好多请求,点击XHR
选项卡,

有两个Ajax
请求,点击第二个(第一个是第一页的Ajax
)查看:

看到了宴宴的信息,原来之前看到的图片个人信息啥的,都是用Ajax
加载过来的!
分析个人主页
接下来,我们再谈谈个人主页,来到宴宴的主页,我们观察其URL
https://mm.taobao.com/self/aiShow.htm?spm=719.7763510.1998643336.36.qMzWeX&userId=143534224
发现,请求参数主要是spm和userId,尝试去掉spm,看能不能访问到页面:

原来是可以用https://mm.taobao.com/self/aiShow.htm?userId=XXXXXX
访问的!
分析个人相册页
我们来到她的相册页,可以像分析个人主页一样,发现用https://mm.taobao.com/self/model_album.htm?user_id=XXXXXX
就可以访问到相册页了。

当我们查看个人相册页源码时,又发现:

什么都没有!老一套,于是我们再次打开了Chrome开发者工具,

果然,又是Ajax
请求!
这也提醒我们只要,我们获得了这个请求的响应内容,爬取图片什么的,都不是事儿了!

哈哈,原来只要请求https://mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20=XXXXXX
就可以了!!
user_id(XXXXXX)怎么弄
经过孜孜不倦的分析,我们终于发现,原来到达其他网页,比如个人首页,相册页等,最重要的就是user_id
那一串数字了,那么那串数字怎么来的呢?
这就得回到我们最开始分析的地方,在分析美人库的时候其实已经得到了:

得到了user_id,再加上我们对URL的分析,我们可以随心所欲了,想爬哪爬哪!
最后附上部分源码,其他的可以根据自己的需求补充或修改:
mport json
import random
import urllib.request
from urllib.request import Request
import chardet
import urllib.parse
user_agent = [
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
]
def getMMData(url,currentPage=0):
formdata = {
'q':'',
'viewFlag':'A',
'sortType':'default',
'searchStyle':'',
'searchRegion':'city:',
'searchFansNum':'',
'currentPage': currentPage,
'pageSize': '100'
}
formdata = urllib.parse.urlencode(formdata)
headers = {'User-Agent': random.choice(user_agent)}
requ = Request(url,data=bytes(formdata,'utf-8'),headers=headers)
data = urllib.request.urlopen(requ).read()
data = data.decode(chardet.detect(data)['encoding'])
dataToDict = json.loads(data)
return dataToDict['data']['searchDOList']
# 获取ID
def getMMID(data):
ID = []
for i in data:
ID.append(i['userId'])
return ID
if __name__ == '__main__':
url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'
# for i in getMMData(url,1):
# print(i['userId'])
data = getMMData(url)
ID = getMMID(data)
print(ID)
然后再次附上扒图结果:

以上。
