Python 学习之数据抓取——淘宝MM数据

看了将近大半个月的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后终于获取到期望的数据了:



获取到的数据文件放到百度云盘了,感兴趣的同学可以看看 点击打开链接



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值