前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考《scrapy动态页面爬取》)。但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓取。

事实上,还有一种执行效率更高的方法。就是事先分析js发出的GET或者POST请求的网址,这样通过python向目标地址发出同样的请求,就可以得到与浏览器一致的response结果。

具体的步骤是:采用chrome浏览器中的调试工具,分析网页中用JavaScript获取数据的request语句。具体分析步骤是:打开监视工具(inspect)——网络(Network)——XHR(XMLHttpRequest),可以找到一个POST request对应的JavaScript或者ajax。接下来要做的就是直接对这个JavaScript或ajax做request操作,以获取我们想要的信息。

以下是通过发送request,获取response的代码示例:

import urllib2
import codecs
import json #读取json中所有的pid,并且生成url list
#sessionUrl ='http://buluo.qq.com/p/detail.html?bid=254116&pid='
defgetUrlList(pContent, sessionUrl):
posts = pContent['result']['posts']
result = ["".join([sessionUrl,i['pid']]) for i in posts]
return result url ='http://buluo.qq.com/cgi-bin/bar/post/get_post_by_page?bid=254116&num=20&start=1980&source=2'
#注意headers应当使用dict类型,以适应request.add_header(key,value)的参数要求
#Cookie:pgv_pvi=1061844992; pgv_si=s7051931648
headers ={'Host':'buluo.qq.com',
'Connection':'keep-alive',
'Accept': 'application/json',
'X-Requested-With':'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (WindowsNT 6.1; WOW64) AppleWebKit/537.36 '+
'(KHTML, like Gecko)Chrome/50.0.2661.102 Safari/537.36',
'Referer':'http://buluo.qq.com/p/barindex.html?bid=254116',
'Accept-Language': 'zh-CN,zh;q=0.8',
}
data = None
req =urllib2.Request(url, data, headers)
response =urllib2.urlopen(req)
content =response.read().decode('utf-8') withcodecs.open('./content.txt', 'wb', encoding = 'utf-8', errors='ignore') as f:
f.write(content) sessionUrl ='http://buluo.qq.com/p/detail.html?bid=254116&pid='
pContent =json.loads(content);
ifpContent['result']['total'] != 0:
print getUrlList(pContent, sessionUrl)
else:
print "no contents in this page!"

爬虫系列5:scrapy动态页面爬取的另一种思路的更多相关文章

  1. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  2. 爬虫系列4:Requests+Xpath 爬取动态数据

    爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...

  3. scrapy爬虫系列之二--翻页爬取及日志的基本用法

    功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...

  4. 爬虫系列3:Requests+Xpath 爬取租房网站信息并保存本地

    数据保存本地 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 爬虫系列2:https://www ...

  5. 爬虫系列2:Requests+Xpath 爬取租房网站信息

    Requests+Xpath 爬取租房网站信息 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 ...

  6. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

    爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...

  7. Java爬虫系列四:使用selenium-java爬取js异步请求的数据

    在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何用jsoup分析html源文件内容得到我们想要的数据,但是有时候通过这两种方式不能正常抓取到我们想要的数据,比如看如下例子. ...

  8. 爬虫系列(1)-----python爬取猫眼电影top100榜

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...

  9. 爬虫系列4:scrapy技术进阶之多页面爬取

    多页面爬取有两种形式. 1)从某一个或者多个主页中获取多个子页面的url列表,parse()函数依次爬取列表中的各个子页面. 2)从递归爬取,这个相对简单.在scrapy中只要定义好初始页面以及爬虫规 ...

随机推荐

  1. Android VideoView播放网络视频简介(转)

    最近项目中用到了很多视频播放的地方,不管是聊天发送的视频消息,还是类似内涵段子的视频列表,都会涉及这些知识,不过网上的知识都很零散,一会找缓存方法,一会找预览图片的方法,一会找视频动态修改尺寸的方法, ...

  2. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  3. Python PIL模块笔记

    利用python pil 实现给图片上添加文字 图片中添加文字#-*- coding: utf-8 -*- from PIL import Image,ImageDraw,ImageFont ttfo ...

  4. ThinkPHP3的使用

    1. 初始目录 7d 根目录 ├─Application 应用目录(空) ├─Public 资源文件目录 ├─ThinkPHP 框架目录 └─index.php 入口文件 2. 入口文件 // 应用入 ...

  5. Buffer和Stream

    Buffer JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据. 因此在 Node.js中,定义了一个 Buffer 类,该类用 ...

  6. Fiddler 抓包工具总结【转载】

    原博主连接在文章底部 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲, ...

  7. 【转】MVC form提交实体接收参数时空字符串值变成null

    问题:entity.BZ的值是null,Request.Form["BZ"]的值是空字符串 目标:让entity.BZ的值是空字符串. 解决方法:在实体的BZ属性上加上 [Disp ...

  8. Python学习之路【第三篇】--集合

    语法结构: set1.issubset(set2)判断集合set1是否为set2的子集,返回布尔值. ? 1 2 3 4 5 6 s1 = {'Java', 'PHP', 'Python', 'C++ ...

  9. Java 8 默认方法(Default Methods)

    Java 8 默认方法(Default Methods) Posted by Ebn Zhang on December 20, 2015 Java 8 引入了新的语言特性——默认方法(Default ...

  10. WINDOWS中, 如何查看一个运行中的程序是64位还是32位的

    转自:https://blog.csdn.net/dayday3923/article/details/78597453?locationNum=7&fps=1 方法一: 任务管理器法任务管理 ...