关于Python爬虫爬淘宝mm详细教程+存入数据库

来源:互联网 发布:一龙恒业 安东 知乎 编辑:程序博客网 时间:2024/05/22 09:26

目标网站:https://mm.taobao.com/search_tstar_model.htm?

具体思路:进入页面我们会看见很多图片,其实每张图片对应一个URL,然后点击一张图片我们就会进入到对应主页,主页里面有大量的图片,我们首先就是获取到当前页面的所有url,然后进入每个url获得对应的每个人的所有图片。

首先我们进入该网页,直接F12进入调试模式,(如果进入不了就右键然后点击审查元素)


        然后点击左上角的那一个按钮,从页面中选择一个元素,随后我们选择第一张,然后就可以发现对应的url, 一般来说我们会复制该url,然后查看页面源代码,搜索该url,然后获取该页面所有的类似url,但是很奇怪这里我们去源代码里面搜索发现根本搜索不到该url,源代码里面搜不到但是为什么我审查元素的时候能看到呢,它这里就是一个ajax异步了。


我们需要了解两点:

1、ajax是asynchronous javascript and XML的简写,就是异步的javascript和XML,这一技术能够向服务器请求额外的数据而无须卸载页面,会带来更好的用户体验。

2、ajax技术的核心是XMLHttpRequest对象(简称XHR)。


然后我们点击网络那个按钮,然后清空掉页面上的那些传输信息,我们刷新网址,然后我们就会得到暂新的传输信息,我们只需要在这些信息里面找类型是html而原因是xhr的那条信息,如图:


(或许你觉得在这么多传输信息里面去找这么一条xhr信息有点为难,那么我们其实可以简单一点)

我们下拉页面到最下面会发现有一个下一页的按钮,我们点击下一页,会发现上面的页面没有动,而下面的图片确实更新了,这很显然就是ajax嘛,所以我们清空掉那些传输信息,然后点击下一页然后传输信息就少很多了,找到xhr就很简单了。如下图:



这样我们便找到了我们所需要的,从页面上我们 可以发现是一个post类型的请求,

post类型的请求我们一般只用关注三点:

1、请求的网址

2、请求的类型是post

3、请求的参数

我们点击参数那个按钮,会得到如下图这样一个表单,这就是代码里面那个data数据的由来了。


同时我们多点击几次下一页并查看信息,会发现对于不同的页面,请求的网址是一样的,类型也都是post,变得只是请求参数的里面的那个currentPage后面的那个数字。是第几个页面后面的就是数字几。

所以我们爬取每个页面的所有个人主页的url的时候只需要将参数里面的currentPage改变就可以了。

(具体实现看代码)

然后我们点击响应按钮,看看这个post请求返回的是什么?


我们发现返回的是json类型的数据,我们需要用import json 然后json.loads(...)将json类型转换为原始数据类型即是dict。然后我们可以发现在这个dict里面可以找到对应页面的所有人的个人信息,city、height、weight、realname、等,其中userId非常重要。


看见上面这张图可以明白userId有多重要了吧,我们访问的每一个人的主页的网址都是前面一部分没变,变得只是后面那个userId。

简单来说就是只要拿到了userId我们就能去到每个人的主页,去到每个人的主页后,拿到她们的图片还不是轻而易举?


这里我们像之前操作那样,查看页面元素,然后发现图片的地址,然后接着到页面源代码里面去查找,会发现每个图片的地址都有两条,所以我们对查找出来的那些图片地址的list要进行一个除重(set即可以)

下面来看下代码吧:当然数据库建表的操作没有写出来,代码注释也没有写,所以建议先看之前那篇博客,里面有详细的介绍:http://blog.csdn.net/three_co/article/details/78575634

看完再来看这个应该能看的差不多。

import requests,json,re,pymysqlclass taobaoMMSpider():    def __init__(self):        self.topUrl = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'        self.basicUrl = 'https://mm.taobao.com/self/aiShow.htm?userId='        self.count = 0    def getuserInfo(self,page):        data = {            'q':'',            'viewFlag':'A',            'sortType':'default',            'searchStyle':'',            'searchRegion':'city:',            'searchFansNum':'',            'currentPage':'%d'%page,            'pageSize':'100',        }        res = requests.post(self.topUrl,data = data)        html = res.text        userInfoList = json.loads(html)['data']['searchDOList']        for userInfo in userInfoList:            name = userInfo['realName']            city = userInfo['city']            height = userInfo['height']            weight = userInfo['weight']            userId = userInfo['userId']            url = self.basicUrl + '%s'%userId            #print(url)            res = requests.get(url)            html = res.text            imageUrlRe = r'(//img.alicdn.com/imgextra/.*?)"'            imageUrlList = list(set(re.findall(imageUrlRe,html)))            #print(imageUrlList)            self.count +=1            print(self.count,'正在爬取%s的信息'%name,'她一共%s张图片'%len(imageUrlList))            for imageUrl in imageUrlList:                self.conndb().execute("insert into image(`name`,`city`,`height`,`weight`,`imageUrl`) values('{}','{}','{}','{}','{}')".format(name,city,height,weight,imageUrl))                self.db.commit()    def conndb(self):        self.db = pymysql.connect(            host = '127.0.0.1',            port = 3306,            user = 'test1',            password = '5531663',            db = 'taobaomm',            charset = 'utf8',        )        cursor = self.db.cursor()        return cursorspider = taobaoMMSpider()for page in range(1,167):    spider.getuserInfo(page)

效果图:一会就存进了10000条图片url。



===================================================================================================

以上,如有不足请多指教。Thanks~!


原创粉丝点击