关于Python爬虫爬淘宝mm详细教程+存入数据库 - Go语言中文社区

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


目标网站: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,pymysql

class 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 cursor

spider = taobaoMMSpider()

for page in range(1,167):
    spider.getuserInfo(page)

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



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

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


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/three_co/article/details/78620345
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 13:43:56
  • 阅读 ( 1198 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢