看了将近大半个月的Python了,之前用java做过一些简单的爬虫程序,爬取过几个Android应用平台的应用数据,现在感觉使用Python做爬虫程序挺好的,网上找了个Python爬虫的程序看了看,参考了别人写的淘宝mm图片抓取程序点击打开链接,进入淘宝MM的个人主页后发现有更多的数据,如生日、学校、身高、体重、三围等等,然后就试着自己写了个爬虫程序,爬取MM的信息。
直接上代码:
import urllib.request
import re
import ssl
import gc
from builtins import print
from builtins import range
from builtins import str
class Spider:
def __init__(self):
self.siteUrl = 'http://mm.taobao.com/json/request_top_list.htm'
self.data = {'User-Agent': 'User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3)'}
self.userinfo = {}
self.count = 1
def getPage(self, url):
request = urllib.request.Request(url, headers=self.data)
content = ssl._create_unverified_context()
response = urllib.request.urlopen(request, context=content)
return response.read().decode('gbk')
def getContent(self, pageIndex):
url = self.siteUrl + "?page=" + str(pageIndex)
page = self.getPage(url)
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:
self.count +=1
# print("淘女郎名称:{0}, 年龄:{1}, 地址:{2} ".format(item[2], item[3], item[4]))
self.userinfo['name'] = item[2]
self.userinfo['age'] = item[3]
self.userinfo['place'] = item[4]
userid = item[0][16:-4]
user_page_url = 'https://mm.taobao.com/self/model_info.htm?user_id=' + userid + '&is_coment=false'
user_page = self.getPage(user_page_url)
pattern_user = re.compile('<dl class="mm-p-info-cercon">.*?<dt.*?><a href=".*?>(.*?)</a>.*?' # 关注数
'<dl class="mm-p-info-fans">.*?<dt.*?><a href=".*?>(.*?)</a>.*?' # 粉丝数
'<dl class="mm-p-info-active">.*?<dt.*?><a href=".*?>(.*?)</a>.*?' # 活跃度
'<dl class="mm-p-info-order">.*?<dt.*?><a href=".*?>(.*?)</a>', # 拍片数
re.S)
items_user = re.findall(pattern_user, user_page)
for im in items_user:
# print("关注数:{0}, 粉丝数:{1}, 活跃度:{2}, 拍片数:{3}".format(im[0], im[1],im[2], im[3]))
self.userinfo['flow'] = im[0]
self.userinfo['fans'] = im[1]
self.userinfo['active'] = im[2]
self.userinfo['order'] = im[3]
user_info_url = "https://mm.taobao.com/self/info/model_info_show.htm?user_id="+userid
user_info_page = self.getPage(user_info_url)
pattern_userinfo = re.compile('<li.*?>.*?<span>(.*?)</span>.*?' # 姓名
'<li class="mm-p-cell-left.*?>.*?<span>(.*?)</span>.*?' # 生日
'<li class="mm-p-cell-right.*?>.*?<span>(.*?)</span>.*?' # 地址
'<li class="mm-p-cell-left.*?>.*?<span>(.*?)</span>.*?' # 职业
'<li class="mm-p-cell-right.*?>.*?<span>(.*?)</span>.*?' # 血型
'<li.*?>.*?<span>(.*?)</span>.*?' # 学校
'<li.*?>.*?<span>(.*?)</span>.*?' # 风格
'<li class="mm-p-small-cell mm-p-height">.*?<var></var>.*?<p>(.*?)</p>.*?' # 身高
'<li class="mm-p-small-cell mm-p-weight">.*?<var></var>.*?<p>(.*?)</p>.*?' # 体重
'<li class="mm-p-small-cell mm-p-size">.*?<var></var>.*?<p>(.*?)</p>.*?' # 三围
'<li class="mm-p-small-cell mm-p-bar">.*?<var></var>.*?p>(.*?)</p>.*?' # 罩杯
'<li class="mm-p-small-cell mm-p-shose">.*?<var></var>.*?<p>(.*?)</p>.*?', # 鞋码
re.S)
user_infos = re.findall(pattern_userinfo, user_info_page)[0]
self.userinfo['birthday'] = user_infos[1]
self.userinfo['profession'] = user_infos[3]
self.userinfo['profession'] = user_infos[3]
self.userinfo['blood_type'] = user_infos[4]
self.userinfo['school'] = user_infos[5]
self.userinfo['style'] = user_infos[6]
fileHandle.write(str(self.userinfo)+'\n')
del self.userinfo
gc.collect()
self.userinfo = {}
if __name__ == "__main__":
spider = Spider()
fileHandle = open('data.txt', 'a')
for i in range(21, 4317):
spider.getContent(i)
print(spider.count)
fileHandle.close()
其中在抓取MM的详细信息的时候遇到了坑:详情页如下
查看元素信息,编写正则表达式
可是总是获取不到想要的数据,一开始是以为正则表达式写错了,捣鼓了好长时间,打印了urlopen的response后发现页面里没有要找的元素,后来查看页面源码才发现,原来详细信息是页面加载完成后又获取的MM信息
修改了URL后终于获取到期望的数据了:
获取到的数据文件放到百度云盘了,感兴趣的同学可以看看 点击打开链接