转载请注明出处: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.屏幕锁,解锁,在取证上的应用

    中国司法-鉴定,2013年第06期杂志  

  2. 代码生成器Kalman Studio2.2发布,完美支持Oracle,不需要安装Oracle客户端

    这次更新主要是增加对Oracle的支持,不需要安装Oracle客户端,下面的配置文件列出了Kalman Studio支持的几种数据库 <?xml version="1.0" ...

  3. Tomcat不能自动编译JSP文件问题的一种解决方法

    今天碰到一个非常奇怪的问题,机器环境是JDK8.Tomcat8,把jQuery MiniUI ( for Java Eclipse)下载后导入到Eclipse中,首页可以显示,但运行操作数据库的页面出 ...

  4. 将树苺派升级到Raspbian 8 (Jessie)

    我的树苺派2B跑的是Raspbian 7 (Wheezy),有不少软件都让我觉察出老旧来.想着Debian官方已经发布Debian 8 (Jessie)大半年了(8.0发布于2015/04/25),树 ...

  5. Android杂谈--小知识点总结(1)

    此知识点总结是开发过程中遇到的比较棘手或者恶心的地方,所以随时更新,以备不时之需 1. viewFlipper中的item如何动态设置高度? 例如: <ViewFlipper android:l ...

  6. 使用B或BL跳转时,下一条指令的地址是这样计算的

    B跳转指令:它是个相对跳转指令,其机器码格式如下: [31:28]位是条件码:[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令:[23:0] ...

  7. 介绍几个工作开发中封装的好用的android自定义控件

    首先看效果图, 看下这两个界面,第一个中用到了一个自定义的FlowRadioGroup,支持复合子控件,自定义布局: 第二个界面中看到了输入的数字 自动4位分割了吧:也用到了自定义的DivisionE ...

  8. npm 发布包

    每个包都必须包含package.json配置文件 生成package.page文件 1.到项目目录下执行npm init根据提示输入即可 最后记得要yes 完成项目后就是要发布到npm了 首先需要有n ...

  9. 使用 Portable Class Library(可移植类库)开发 Universal Windows App

    今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...

  10. Razor 在WebApp 框架的运用

    前面有两章介绍了WebApp框架<WebApp MVC,“不一样”的轻量级互联网应用程序开发框架>和<WebApp MVC 框架的开发细节归纳>,其中视图引擎是用的Nveloc ...