Ajax异步信息抓取方式

淘女郎模特信息抓取教程 源码地址: cnsimo/mmtao

网址:https://0x9.me/xrh6z

 

判断一个页面是不是Ajax加载的方法:

查看网页源代码,查找网页中加载的数据信息,如果源代码中不显示,证明是Ajax加载。

 

如果是网站源代码中就包含要爬取的信息,那么就直接只用正则拿数据出来就行了

但是如果网页源码中没有,那么就是Ajax了,可以进行抓包找到获取数据的相关接口,操作如下(以爬取淘女郎美女信息为例):

 

一、初级

寻找API接口:获取模特列表。

如果使用的是Chrome的话,可以首先选中XHR来更快速的找出获取数据的API,如果在XHR里面没有再去JS里面一个个的寻找。

 

找到API的URL为:https://mm.taobao.com/alive/list.do

经过尝试,后面的参数都是可以去掉的,访问的时候默认page为1,所以如果要获取到所有页,需要使用for循环分别获取每一页的模特列表。

 

然后打开一个模特的详情页面,使用红框圈住的地方都是我们要获取到的数据

 

打开开发者工具,然后进行和刚刚相似的抓包操作。首先选中XHR进行快速的找出获取数据的API接口,可以很容易的找到这个地址:

 

 

 

二、中级

下面我们抓取所有的妹子数据到文件中:

不难找到获取后台数据的地址为:https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8

 

但是我们发现在地址的GET参数中只有一个_input_charset=utf-8,而且默认获取的是第一页的妹子列表,正常情况下我们在GET参数中可以看到page=1类似的项,但这里没有,那么很显然它没有用GET就肯定用了POST,结果一看发现确实是这样子的。

 

那么,这就简单了,使用requests库post请求数据,将请求来的json数据保存成表格,这项工作就结束了。

 

下面贴出代码:

headers.py   -----------这个文件中保存了一些常用的headers头信息

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Date    : 2018-02-02 19:40:50

# @Author  : cnsimo (2020745751@qq.com)

# @Link    :

# @Version : 1.0

import random

 

uaStr = '''Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)

Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1

Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)

MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'''

 

def getUA():

  uaList = uaStr.split('\n')

  length = len(uaList)

  return uaList[random.randint(0,length-1)]

 

if __name__ == '__main__':

  print(getUA())

mmtao.py  ------------主程序

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Date    : 2018-02-02 23:11:08

# @Author  : cnsimo (2020745751@qq.com)

# @Link    :

# @Version : 1.0

 

from myheaders import getUA

import requests

import re

import time

import csv

 

mmListUrl = 'http://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'

mmUrl = ''

 

# 获得总共的页数

def getTotalPage():

  headers = {'User-Agent': getUA()}

  req = requests.get(mmListUrl, headers=headers)

  res = req.json()

  return res['data']['totalPage']

 

# 获取列表的函数

def getMMList(cpage = 1):

  headers = {'User-Agent': getUA()}

  payload = {'currentPage': cpage, 'pageSize': 100, 'sortType': 'default', 'viewFlag': 'A'}

  req = requests.post(mmListUrl, headers=headers, data=payload)

  res = req.json()

  if 'data' in res.keys():

           return res['data']['searchDOList']

  else:

           return

 

if __name__ == '__main__':

  totalPage = getTotalPage()

  with open(r'mmlist.csv', 'w+', newline='') as fs:

           count = 1

           cpage = 1

           csvwriter = csv.writer(fs, dialect='excel')

           page1 = getMMList(cpage)

           csvwriter.writerow(page1[0].keys())

           print('正在处理第%s页。。。' % cpage)

           for mm in page1:

                   csvwriter.writerow(mm.values())

                   print(str(count)+' ', end='')

                   count += 1

           print()

           while cpage < totalPage:

                   cpage += 1

                   print('正在处理第%s页。。。' % cpage)

                   time.sleep(2)

                   mmList = getMMList(cpage)

                   if not mmList:

                            break

                   for mm in mmList:

                           csvwriter.writerow(mm.values())

                            print(str(count)+' ', end='')

                            count += 1

                   print('')

 

  print('所有数据处理完毕!')

 

导出的数据如下:

 

 

三、高级

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxdyj.html