Ajax异步信息抓取方式
淘女郎模特信息抓取教程
源码地址: cnsimo/mmtao
判断一个页面是不是Ajax加载的方法:
查看网页源代码,查找网页中加载的数据信息,如果源代码中不显示,证明是Ajax加载。
如果是网站源代码中就包含要爬取的信息,那么就直接只用正则拿数据出来就行了
但是如果网页源码中没有,那么就是Ajax了,可以进行抓包找到获取数据的相关接口,操作如下(以爬取淘女郎美女信息为例):
一、初级
- 寻找API接口:获取模特列表。
如果使用的是Chrome的话,可以首先选中XHR来更快速的找出获取数据的API,如果在XHR里面没有再去JS里面一个个的寻找。
- 找到API的URL为:https://mm.taobao.com/alive/list.do
经过尝试,后面的参数都是可以去掉的,访问的时候默认page为1,所以如果要获取到所有页,需要使用for循环分别获取每一页的模特列表。
- 然后打开一个模特的详情页面,使用红框圈住的地方都是我们要获取到的数据
- 打开开发者工具,然后进行和刚刚相似的抓包操作。首先选中XHR进行快速的找出获取数据的API接口,可以很容易的找到这个地址:
二、中级
下面我们抓取所有的妹子数据到文件中:
- 但是我们发现在地址的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 : http://www.scriptboy.com
# @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 : http://www.scriptboy.com
# @Version : 1.0
from myheaders import getUA
import requests
import re
import time
import csv
mmListUrl = 'https://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://mm.taobao.com/self/model_info.htm?spm=719.7800510.a312r.22.bKq7m9&user_id=277949921,
这里的信息要更加全面一些,所以我们从列表也只获取模特ID,然后通过模特卡来拿到更加详细的信息。
- 首先分析模特卡页面,还是通过开发者工具,我们很容易找到了获取数据的URL:https://mm.taobao.com/self/info/model_info_show.htm?user_id=277949921
- 这次响应的数据并不是格式的,不过没有关系,我们还可以使用正则表达式将信息匹配出来。
- 这样我们仅仅比刚才编写的程序多了一个分析模特卡的步骤,很快就能写出来这个代码了。
代码详见:压缩文件中 mmtao_plus.py
源码地址: cnsimo/mmtao
Ajax异步信息抓取方式的更多相关文章
- 15-分析Ajax请求并抓取今日头条街拍美图
流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...
- 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...
- 分析Ajax请求并抓取今日头条街拍美图
项目说明 本项目以今日头条为例,通过分析Ajax请求来抓取网页数据. 有些网页请求得到的HTML代码里面并没有我们在浏览器中看到的内容.这是因为这些信息是通过Ajax加载并且通过JavaScript渲 ...
- Atitit.web的自动化操作与信息抓取 attilax总结
Atitit.web的自动化操作与信息抓取 attilax总结 1. Web操作自动化工具,可以简单的划分为2大派系: 1.录制回放 2.手工编写0 U' z; D! s2 d/ Q! ^1 2. 常 ...
- 网页信息抓取 Jsoup的不足之处 httpunit
今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取,相信Jsoup基本是首选的工具,完全的类JQuery操作,让人感觉很舒服.但是,今天我们就要说一说Jsoup的不足. 1.首先我们新 ...
- 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)
转自原文 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp) 最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决 ...
- 接口测试——fiddler对soapui请求返回信息抓取
原文:接口测试——fiddler对soapui请求返回信息抓取 背景:接口测试的时候,需要对接口的请求和返回信息进行查阅或者修改请求信息,可利用fiddler抓包工具对soapui的请求数据进行抓取或 ...
- 汽车之家汽车品牌Logo信息抓取 DotnetSpider实战[三]
一.正题前的唠叨 第一篇实战博客,阅读量1000+,第二篇,阅读量200+,两篇文章相差近5倍,这个差异真的令我很费劲,截止今天,我一直在思考为什么会有这么大的差距,是因为干货变少了,还是什么原因,一 ...
- Python网络爬虫(Get、Post抓取方式)
简单的抓取网页 import urllib.request url="http://google.cn/" response=urllib.request.urlopen(url) ...
随机推荐
- sublime 设置新建文件自动添加author(作者)等文件头信息
很多时候, sublime 自带自动添加文件头信息, 但是并不是我们想要比如下面这样的:新建一个python文件 自动添加的author 信息== 上面并不是我想要的, 我想要下面这样的效果:== 这 ...
- Machine Learning - week 3
Classification 使用线性回归来分类,会很不准确.并且,它的范围也会超出 {0, 1}.所以使用下面的逻辑回归模型. Hypothesis representation 线性回归中 hθ( ...
- poj 2758 && BZOJ 2258 Checking the Text 文本校对
Description 为了给Wind买生日礼物,Jiajia不得不找了一份检查文本的工作.这份工作很无聊:给你一段文本 要求比对从文本中某两个位置开始能匹配的最大长度是多少.但比无聊更糟糕的是, ...
- 【新版】Android技术博客精华汇总
[新版]Android技术博客精华汇总(原文链接内持续更新) http://www.apkbus.com/thread-313856-1-1.html Kotlin Kotlin学习资料汇总 http ...
- hadoop2.6.0集群搭建
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- MVC 统一异常处理
在出现异常时,我们不希望将错语的原因让客户看见,常常会做一个404错误页面,将所有发生的异常都跳至该页面,并把异常信息写在日志中.步骤如下: 1.让我们看看Global.asax页面Applicati ...
- Vue-cli搭建完项目,各文件解释
脚手架vue-cli搭建完成后,会生成一些文件,总结学习一下这些文件是做什么用的:1.一级目录: build和config文件夹是wbepack配置的文件夹: node_modules是在我npm i ...
- UE4 多线程(一)
UE4中使用多线程的有两种方式,一种方式就是使用FRunnable和FRunnableThread,另一种方式是Task Graph System.Task Graph System有时会占用游戏线程 ...
- 关于jquery ajax跨域请求获取response headers问题
背景:最近项目jwt用户认证方式,关于jwt本人就不再赘述,大家可自行百度. jwt token基本流程是这样的: 用户使用用户名密码来请求服务器 服务器进行验证用户的信息 服务器通过验证发送给用户一 ...
- 这个时间格式2017-09-26-T04:00:00Z php识别不出来
这应该不对吧 这是什么格式?看起来不标准,一般不都是传 2017-09-26 04:00:00 这种吗?不行用正则筛吧.echo date('Y-m-d H:i:s',date_create_from ...