本文转自我的个人博客
最近在倒腾ajax爬虫,顺便记录一下过程。以36Kr “早期项目” 一栏为例,大致分为如下两步。

解析索引页

难点在于如何获取索引页的url。浏览器打开36Kr,按F12打开开发者工具,切换到Netwotk 面板。AJAX 一般是通过 XMLHttpRequest 对象接口发送请求的,XMLHttpRequest 一般被缩写为 XHR。所以点击XHR,清空监听到的内容。如下图:

点击页面导航栏“早期项目”,method 为 GET 的响应就是我们需要的,选中项目鼠标右键 “Copy link address”,内容如下:http://36kr.com/asynces/posts/feed_column_more.json?column=starding,这就是起始url,将url输入到浏览器地址栏,得到索引页面的josn字数据,内容如下:

推荐安装 JSONView 插件,这样可以看到更好看的 JSON 格式,展开折叠列等功能。然后,我们根据 JSON 数据的结构提取资讯标题,时间,和url_code(后文介绍这个字段)。

def parseIndex(url):jsContent = requests.get(url)jsDict = json.loads(jsContent.content)for data in jsDict['data']['feed_posts']:# 存放一条资讯item = {}item['title'] = data['title']item['publish_time'] = data['published_at']item['index'] = data['url_code']contentUrl = "http://36kr.com/p/"+str(item['index'])+".html"item['url'] = contentUrlitem['summary'] = parseContent(contentUrl)db.append(item)

获取了起始url,那么如何模拟点击“获取更多”?可以认为这是一个翻页按钮,只要获取下一页对应的url即可。清空开发者工具,在“早期项目”栏下点击“获取更多”,同样的方法获取新的链接http://36kr.com/asynces/posts/feed_column_more.json?b_url_code=5046782&column=starding,这就是下一页的url,可将其调整为http://36kr.com/asynces/posts/feed_column_more.json?column=starding&b_url_code=5046782,并将起始url调整为http://36kr.com/asynces/posts/feed_column_more.json?column=starding&b_url_code=,注意到这个b_url_code=5046782是什么鬼,尝试在刚刚获取的json数据里搜索5046782,发现这正是最后一条资讯的url_code,想必大家应该明白了如何生成下一个索引页的链接了吧。

while (totalPage >= 1):parseIndex(url)# 获取最后一条资讯的url_code,拼接下一个索引页的urlindex = db[-1]['index']url = "http://36kr.com/asynces/posts/feed_column_more.json?column=starding&b_url_code="url += str(index)totalPage -=1

至此,解析索引页的工作结束。

解析资讯页

点击“早期项目”的第一条资讯,并从浏览器地址栏获得url为http://36kr.com/p/5046804.html,根据前文的经验,很快发现这个5046804正是其url_code,“http://36kr.com/p/”+url_code+“.html”便是资讯链接,因此这个字段成功获取。如何获取资讯正文呢?

查看网页源码,不难发现正文对应的xpath是“//div/@data-props”,解析后发现response同样为json数据,内容如下,根据json结构便可轻松获取内容。

{"status":{"code":"200","message":"返回成功"},"data":{"router":"/p/5046804.html","post":{"id":45805,"title":"大咖拍卖:做线上艺术品拍卖,“经纪人”或许是互联网更容易撬动的一环","summary":"“传统机构是典型的一级市场,而拍卖是二级市场行为”","cover":"http://a.36krcnd.com/nil_class/e0edfc83-02c3-4597-9f6f-80fd734bf8f3/1.pic.jpg","url_code":5046804,"published_at":"2016-05-10T14:24:28.168+08:00","key":"2c515a1d-364c-4041-b524-b192319310c1","extra":{"source_urls":null,"jid":"","close_comment":false,"mobile_views_count":0,"related_company_type":"domestic"},"source_type":"original","related_company_id":141335,"display_tag_list":["大咖拍卖","艺术收藏","泛娱乐"],"plain_summary":"“传统机构是典型的一级市场,而拍卖是二级市场行为”","display_content":"...内容略去...","author":{"id":458247,"domain_path":"/posts/zibing","display_name":"二水水","avatar":"https://krid-assets.b0.upaiyun.com/uploads/user/avatar/327099/09d80114-dabb-4f1f-8cdc-d12f1fe7183c.jpeg!480"},"crowd_funding":"https://mobilecodec.alipay.com/show.htm?code=rex096303svi4ij2pmmckd3","internal_links":[],"source_message":"原创文章,作者:二水水"}}}
def parseContent(contenturl):res = html.parse(contenturl).xpath("//div/@data-props")[0]data = json.loads(res)# 获取摘要,资讯正文对应字段为display_content,此处并未获取return data['data']['post']['summary']

至此整个工作接近尾声,下面组织一下代码。

完整代码如下

#-*-coding:utf8-*-import requests
import json
from lxml import html# 列表存储爬取的资讯
db = []def parseContent(url):res = html.parse(url).xpath("//div/@data-props")[0]data = json.loads(res)return data['data']['post']['summary']def parseIndex(url):jsContent = requests.get(url)jsDict = json.loads(jsContent.content)for data in jsDict['data']['feed_posts']:# 每条资讯对应一个字典item = {}item['title'] = data['title']item['publish_time'] = data['published_at']item['index'] = data['url_code']contentUrl = "http://36kr.com/p/"+str(item['index'])+".html"item['url'] = contentUrl# 解析正文页item['summary'] = parseContent(contentUrl)db.append(item)def main(totalPage):'''totalPage: 抓取的索引页页数'''# 起始urlurl = "http://36kr.com/asynces/posts/feed_column_more.json?column=starding&b_url_code="while (totalPage >= 1):# 解析索引页parseIndex(url)# 获取最后一条资讯的url_codeindex = db[-1]['index']# 拼接下一个索引页的urlurl = "http://36kr.com/asynces/posts/feed_column_more.json?column=starding&b_url_code="url += str(index)totalPage -=1# 打印数据print len(db)for item in db:print itemif __name__ == '__main__':main(3) # 设置为抓取3页资讯

python ajax爬虫 --36Kr为例相关推荐

  1. Python爬虫项目100例

    前言 Python爬虫项目100例(一):入门级 CentOS环境安装 和谐图网站爬取 美空网数据爬取 美空网未登录图片爬取 27270图片爬取 蜂鸟网图片爬取之一 蜂鸟网图片爬取之二 蜂鸟网图片爬取 ...

  2. Python爬虫项目70例,附源码 70个Python爬虫练手实例

    今天博主给大家带来了一份大礼,Python爬虫70例!!!以及完整的项目源码!!! 本文下面所有的爬虫项目都有详细的配套教程以及源码,都已经打包好上传到百度云了,链接在文章结尾处! 扫码此处领取大家自 ...

  3. python爬虫编程100例_哪种Python程序员最赚钱?爬虫数据告诉你!

    世界上有三种宝贵的东西: 知识.粮食和友谊. 那么,1 块钱,你能买到什么呢? 骑一次共享单车 买 2 包辣条 1/190 件格子衬衫 1/299 支口红 1/10099 个 iPhone XS 但是 ...

  4. 以爬取知乎为例,进行python 多进程爬虫性能分析

    以爬取知乎为例,进行python 多进程爬虫性能分析 如果对多进程multiproessing模块不熟悉,请先浏览 python 使用multiprocessing模块进行多进程爬虫 问题背景: 爬取 ...

  5. Python网络爬虫与信息提取笔记08-实例2:淘宝商品比价定向爬虫

    Python网络爬虫与信息提取笔记01-Requests库入门 Python网络爬虫与信息提取笔记02-网络爬虫之"盗亦有道" Python网络爬虫与信息提取笔记03-Reques ...

  6. python网络爬虫的基本步骤-python爬虫入门需要哪些基础/python 网络爬虫教程

    如何入门 Python 爬虫 入门个吊,放弃 python爬虫入门需要哪些基础 现在之所以有多的小伙伴热衷于爬虫技术,无外乎是因为爬我们做很多事情,比如搜索引擎.采集数据.广告过滤等,以Python为 ...

  7. python爬虫抓取图片-python网络爬虫源代码(可直接抓取图片)

    在开始制作爬虫前,我们应该做好前期准备工作,找到要爬的网站,然后查看它的源代码我们这次爬豆瓣美女网站,网址为:用到的工具:pycharm,这是它的图标 ...博文来自:zhang740000的博客 P ...

  8. python爬虫代码-python网络爬虫源代码(可直接抓取图片)

    在开始制作爬虫前,我们应该做好前期准备工作,找到要爬的网站,然后查看它的源代码我们这次爬豆瓣美女网站,网址为:用到的工具:pycharm,这是它的图标 ...博文来自:zhang740000的博客 P ...

  9. Python分布式爬虫打造搜索引擎

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自 ...

最新文章

  1. 基于对偶学习的跨领域图片描述生成
  2. unet脑肿瘤分割_2D UNet3+ Pytorch实现 脑肿瘤分割
  3. 在终端显示文本的中间部分
  4. 重装win7后修改桌面路径到D盘
  5. 数据结构与算法--面试必问AVL树原理及实现
  6. linux php 版本切换,linux更换PHP版本,多个PHP版本切换
  7. react native text换行_基于React+Koa实现React SSR服务端渲染
  8. GCC和TCC编译TCC
  9. 精简DropDownList用法
  10. 服务器内存升级与oracle 参数调整 实施
  11. 蚂蚁金服 TRaaS 技术风险防控平台解密
  12. 【转】详解GAN代码之逐行解析GAN代码
  13. Android webview 下载文件(文件名,扩展名)
  14. 转专业选择计算机的理由,转专业面试自我介绍范文
  15. SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么
  16. 解决PHP "headers already sent"错误
  17. 如何给国外老师写邮件
  18. 有一种星光叫记忆:张国荣主演的九部经典影片
  19. linux系统遇到挖矿程序
  20. 2021中国IC封装基板市场现状及未来发展趋势

热门文章

  1. 关于使用MethodHandle在子类中调用祖父类重写方法的探究
  2. 关于怎么在echarts飞机迁移图中换掉飞机图标
  3. ubuntu安装showdoc
  4. 领健医美saas管理系统软件之【医美经营宝典】医美机构微信:如何精准化拓客引流?初入医美咨询行业重点有哪些?
  5. IT 安全专业人员需要 CISSP 认证 - 网络安全专家 Joseph Steinberg 推荐的认证
  6. 机器学习基础(一)--基本概念和分类
  7. python制作俄罗斯方块
  8. 啥都不会只能瞎暴力——剪子-包袱-锤
  9. inno setup 窗口拖动学习
  10. 游戏资讯 APP,包括四大主要板块【新闻】【视频】【美图】【个人中心(未完成)】