转载请注明出处:http://www.cnblogs.com/codefish/p/4993809.html

最近在群里频繁的被问到ajax和js的处理问题,我们都知道,现在很多的页面都是用动态加载的技术,这一方面带来了良好的页面体验,另一方面,在抓取时或者或少的带来了相当大的麻烦,因为我们知道直接get主页页面url,这些内容是没有办法显示的。那怎么处理这些内容呢?

上图是一个直观的分析,在抓取数据时,我们一般优先考虑到手机端的网站,因为手机端的网站得到数据相对容易,特别是wap协议的网站,其分页方式大多不是ajax分页或者瀑布流的形式,所以抓取相对容易的多。另外在分析到请求头之后,我们可以很方便得到ajax请求地址,这个时候直观的去call这个地址,看能否正常的得到的数据。换了浏览器然后在call一次,看数据能否正常,如果正常,那个url可能就是public的,那在保障一定的频率访问之后就可以很容易的拿到数据。下面我用一个例子来说明分析请求的。

一,打开目标网站,查看加载方式:

https://www.abdserotec.com/primary-antibodies-monoclonal-polyclonal.html#productType=Monoclonal%20Antibody

二,分析网站

当我打开网站的时候,可以很明显的发现数据是通过下拉列表,到底端之后解发ajax事件来请求数据的,那我们实际的去他在请求的时候都发生了哪些事情

我们得到请求地址了:

https://api.uk-plc.net/product_tables/v1/abd?filter={%22productType%22:{%22$in%22:[%22Monoclonal%20Antibody%22]}}&skip=360&limit=40&sort=[[%22specificitySummary%22,1],[%22host%22,1],[%22uniqueName%22,1],[%22format%22,1]]

那我直接在浏览器打开看看:

很显然的看到了熟悉的json格式的字符串

别急,这里我们需要更换浏览器打开刚刚的api接口,为什么要这样做?因为我们现在打开的时候都会带上了一定的请求参数,我们更换浏览器就是清掉这些参数,然后再来访问,如果还是得到数据,这样说明这个api接口本身就是public的,而且管理员对这个接口没有做filter 。

三,进一步分析参数

OK,这直接说明了可以直接访问这个接口,那如何分页呢?

我们来看URL里面都有哪些参数:

https://api.uk-plc.net/product_tables/v1/abd?filter={%22productType%22:{%22$in%22:[%22Monoclonal%20Antibody%22]}}&skip=360&limit=40&sort=[[%22specificitySummary%22,1],[%22host%22,1],[%22uniqueName%22,1],[%22format%22,1]]

skip=360

limit=40

这和C# linq的分页的方式何其的相似, 那我可以这样大胆假设一下:

limit 就是pagecount,每页的数量

skip就是略过第几页的数据

pageindex 第几页

那相应的取得几页的数据就是:

skip =(pageindex-1)*pagecount

limit = 40

验证一下,数据还是得到

四,写代码

这里面我用python 写了一个简单的脚本:

__author__ = 'Bruce'
import requests page_count = 20
page_index = 1
url_template = 'https://api.uk-plc.net/product_tables/v1/abd?filter={%22productType%22:{%22$in%22:[%22Monoclonal%20Antibody%22,%22Polyclonal%20Antibody%22]}}&skip={page_index}&limit={page_count}&sort=[[%22specificitySummary%22,1],[%22host%22,1],[%22uniqueName%22,1],[%22format%22,1]]' def get_json_from_url(url):
r = requests.get(url)
return r.json()['results'] def init_url_by_parms(page_count=40, page_index=1):
if not page_count or not page_index:
return ''
return url_template.replace('{page_index}', str((page_index - 1) * page_count)).replace('{page_count}',
str(page_count)) if __name__ == '__main__':
url = init_url_by_parms(page_count=page_count, page_index=page_index)
print url
objs = get_json_from_url(url)
if objs:
for obj in objs:
print '####################################'
for k, v in obj.items():
print k, ':', v

另外,朋友说如何得到总页数呢?我们假定以现有的40页的数据量,假定总页数为100,如果第100页有数据,那访问第200页,如果没有得到数据,那访问第(100+200)/2页数据,依此类推,差不多log2N次就可以得到总页数,这里就用二分法就可以得到。

总结:

本次文章主要分析ajax可以直接调用和分析请求的过程,在我看来,码代码通过思考来分析问题,比硬写代码死磕来的强的多,下次我将分析一下直接call ajax接口没办法解决的情况.

 转载请注意出处:http://www.cnblogs.com/codefish/p/4993809.html

(9)分布式下的爬虫Scrapy应该如何做-关于ajax抓取的处理(一)的更多相关文章

  1. (4)分布式下的爬虫Scrapy应该如何做-规则自动爬取及命令行下传参

    本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提 ...

  2. (5)分布式下的爬虫Scrapy应该如何做-windows下的redis的安装与配置

    软件版本: redis-2.4.6-setup-64-bit.exe — Redis 2.4.6 Windows Setup (64-bit) 系统: win7 64bit 本篇的内容是为了给分布式下 ...

  3. (2)分布式下的爬虫Scrapy应该如何做-关于对Scrapy的反思和核心对象的介绍

    本篇主要介绍对于一个爬虫框架的思考和,核心部件的介绍,以及常规的思考方法: 一,猜想 我们说的爬虫,一般至少要包含几个基本要素: 1.请求发送对象(sender,对于request的封装,防止被封) ...

  4. (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接

    放假这段时间好好的思考了一下关于Scrapy的一些常用操作,主要解决了三个问题: 1.如何连续爬取 2.数据输出方式 3.数据库链接 一,如何连续爬取: 思考:要达到连续爬取,逻辑上无非从以下的方向着 ...

  5. (8)分布式下的爬虫Scrapy应该如何做-图片下载(源码放送)

      转载主注明出处:http://www.cnblogs.com/codefish/p/4968260.html 在爬虫中,我们遇到比较多需求就是文件下载以及图片下载,在其它的语言或者框架中,我们可能 ...

  6. (1)分布式下的爬虫Scrapy应该如何做-安装

    关于Scrapy的安装,网上一搜一大把,一个一个的安装说实话是有点麻烦,那有没有一键安装的?答案显然是有的,下面就是给神器的介绍: 主页:http://conda.pydata.org/docs/ 下 ...

  7. scrapy爬虫学习系列五:图片的抓取和下载

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  8. Python爬虫入门教程 33-100 电影评论数据抓取 scrapy

    1. 海王评论数据爬取前分析 海王上映了,然后口碑炸了,对咱来说,多了一个可爬可分析的电影,美哉~ 摘录一个评论 零点场刚看完,温导的电影一直很不错,无论是速7,电锯惊魂还是招魂都很棒.打斗和音效方面 ...

  9. python3爬虫再探之豆瓣影评数据抓取

    一个关于豆瓣影评的爬虫,涉及:模拟登陆,翻页抓取.直接上代码: import re import time import requests import xlsxwriter from bs4 imp ...

随机推荐

  1. android 6.0权限判断 音频 拍照 相册

    ------------------------------------------打开音频权限------------------------------------------------ if ...

  2. iOS客户端的在线安装和更新——针对ADHoc证书

    这篇文章纯给自己留个备份,所以对AdHoc证书内部分发和对iOS客户端开发不了解的请直接无视. 一般在iOS游戏或应用开发过程中,正式发布到App Store之前,都需要内部的测试,客户端的安装是个不 ...

  3. android 性能分析、优化

    .主要介绍了一些分析工具,比如GT.ITest等http://www.jianshu.com/p/8b77d394b2a6 .详细介绍啦android平台常见性能优化工具http://blog.csd ...

  4. [emacs org-mode小技巧] org-indent-mode 让文档更容易阅读

    刚发现Emacs的org-mode里面一个叫做 org-indent-mode 的minor mode对于阅读org-mode文档很不错,版面看起来清晰多了: 从上图可以看到,org-indent-m ...

  5. DB2中OLAP函数使用示例

      下面的需求是将不仅获取查询的结果集,还要将结果集的SIZE返回.结果集的SIZE是无法通过CURSOR获取的.   通常聚合函数在二种情况下,使用默认分组即没有分组.可以直接使用,比如 selec ...

  6. iOS开发——高级技术精选&底层开发之越狱开发第一篇

    底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...

  7. swift 如何删除subviews

    scrollView.subviews.map { (var view) -> () in if (view is UIButton) { view.removeFromSuperview() ...

  8. 使用U盘代替光盘来刻录ISO镜像文件的方法

    原文链接: http://jingyan.baidu.com/article/d3b74d64aa4a6a1f77e60932.html 1.以管理员身份运行UltraISO,点击“文件”菜单下的“打 ...

  9. LoadRunner性能测试结果分析

    LoadRunner性能测试结果分析http://www.docin.com/p-793607435.html

  10. VR是TAA的终结者吗?

    在刚刚发布的Unreal Engine 4.14中,其第一个重要的特性就是增加了在VR开发中对Forward Shading的支持.我们都知道在很多方面Deferred Shading都优于Forwa ...