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

转载请注明出处: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

时间: 2024-08-27 15:51:30

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

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

本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提取所有的ur 链接,我们定义一个规则,根据规则(用正则表达式来限制)来提取我们想要的连接形式,然后爬取这些页面,进行一步的处理(数据提取或者其它动作),然后循环上述操作,直到停止,这个时候有一个潜在的问题,就是重复爬取,在scrapy 的框架下已经着手处理了这些问题,一般来说,对于爬取过滤的问题,通

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

  转载主注明出处:http://www.cnblogs.com/codefish/p/4968260.html 在爬虫中,我们遇到比较多需求就是文件下载以及图片下载,在其它的语言或者框架中,我们可能在经过数据筛选,然后异步的使用文件下载类来达到目的,Scrapy框架中本身已经实现了文件及图片下载的文件,相当的方便,只要几行代码,就可以轻松的搞定下载.下面我将演示如何使用scrapy下载豆瓣的相册首页内容. 优点介绍: 1)自动去重 2)异步操作,不会阻塞 3)可以生成指定尺寸的缩略图 4)计算

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

关于Scrapy的安装,网上一搜一大把,一个一个的安装说实话是有点麻烦,那有没有一键安装的?答案显然是有的,下面就是给神器的介绍: 主页:http://conda.pydata.org/docs/ 下载地址:http://continuum.io/downloads 两个版本,64位和32位,根据自己的系统下载 下载之后一键安装,安装完之后以管理员身份运行CMD 输入下列命令: conda install scrapy 出现对话是否安装,输入Y 吃吃薯片,看看毛片,等着安装完就好了.完了之后就可

爬虫,可用于增加访问量和抓取网站全页内容

爬虫,可用于增加访问量和抓取网站全页内容 爬虫道德规范: 1.不让爬的咱不爬 2.让爬的咱不能一直爬 使用爬虫提高文章访客说明: 1.本爬虫使用代理IP 2.伪装浏览器 3.粘贴地址即可使用 4.原文件 github 地址:https://github.com/xpwi/py/blob/master/py%E7%88%AC%E8%99%AB/eyes.py 5.下载原文件:https://xpwi.github.io/py/py%E7%88%AC%E8%99%AB/eyes.py # codin

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

1. 海王评论数据爬取前分析 海王上映了,然后口碑炸了,对咱来说,多了一个可爬可分析的电影,美哉~ 摘录一个评论 零点场刚看完,温导的电影一直很不错,无论是速7,电锯惊魂还是招魂都很棒.打斗和音效方面没话说非常棒,特别震撼.总之,DC扳回一分( ̄▽ ̄).比正义联盟好的不止一点半点(我个人感觉).还有艾梅伯希尔德是真的漂亮,温导选的人都很棒.真的第一次看到这么牛逼的电影 转场特效都吊炸天 2. 海王案例开始爬取数据 数据爬取的依旧是猫眼的评论,这部分内容咱们用把牛刀,scrapy爬取,一般情况下,

scrapy框架【全栈/深度抓取】

五大核心组件 - 引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心) - 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 - 下载器(Downloader) 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) - 爬虫(Spiders) 爬虫

python爬虫:使用urllib.request和BeautifulSoup抓取新浪新闻标题、链接和主要内容

案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSoup import requests url = 'http://news.sina.com.cn/china/' web_data = requests.get(url) web_data.encoding = 'utf-8' soup = BeautifulSoup(web_data.text,'

爬虫很简单么?直到我抓取了一千亿个网页后我懂!爬虫真不简单!

现在爬虫技术似乎是很容易的事情,但这种看法是很有迷惑性的.开源的库/框架.可视化的爬虫工具以及数据析取工具有很多,从网站抓取数据似乎易如反掌.然而,当你成规模地在网站上抓东西时,事情很快就会变得非常棘手. 私信小编007即可获取数十套PDF哦! 规模爬取技术为什么重要? 跟标准的web爬取应用不一样的是,规模爬取电子商务产品数据有一项独特挑战使得web抓取要困难许多. 本质上这些挑战可归结为两件事情: 速度 和 数据质量 . 挑战#1--草率而且总是在变的网站格式 这一点很明显但也许不是最性感的

【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack

最近在模拟HTTP请求抓取数据,但是服务器是asp.net开发的 分页控件代码 <tr> <td align="left">共&nbsp210&nbsp条记录&nbsp--&nbsp第&nbsp2&nbsp页&nbsp--&nbsp共&nbsp3&nbsp页</td><td align="right"><a id="Orac