前言:几种渲染js,ajax插件对比

(1)selenium+webdriver(如firefox,chrome等)。这要求你系统有对应浏览器,并且过程中要全程开浏览器。说白了,就是你通过浏览器能看到啥,就能抓到啥。一般遇到特别复杂的验证码时,这个方法是有必要的,当然,开着浏览器爬虫的效率可想而知。

(2)selenium+phantomjs。PhantomJS是一个WebKit,他的使用方法和webdriver一样,但是他不需要开浏览器,你可以直接跑在无需GUI的linux服务器上,这点很赞。

(3)scrapy-splash。这个和以上两种方法比,优势有以下几点。

  • splash作为js渲染服务,是基于Twisted和QT开发的轻量浏览器引擎,并且提供直接的http api。快速、轻量的特点使其容易进行分布式开发。
  • splash和scrapy融合,两种互相兼容彼此的特点,抓取效率较好。
  • 虽然目前只有英文文档,但写的已经很详细了,仔细阅读便能快速开发。

与普通的scrapy项目,使用phantomjs只需要修改两处

(1)创建 下载中间件JavaScriptMiddleware

# -*- coding: utf-8 -*-
from selenium import webdriver
from scrapy.http import HtmlResponse
import time
import requests
from scrapy.downloadermiddlewares.stats import DownloaderStats
global  driver
driver= webdriver.PhantomJS() #指定使用的浏览器,写在此处而不写在类中,是为了不每次调用都生成一个信息独享,减少内存使用
print"PhantomJS is starting..."
class JavaScriptMiddleware(object):def process_request(self, request, spider):global driver# driver = webdriver.Firefox()url=request.url;#driver.get(url)#time.sleep(1)js = "var q=document.documentElement.scrollTop=10000"driver.execute_script(js) #可执行js,模仿用户操作。此处为将页面拉至最底端。#body = driver.page_sourceuser_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; windows NT)'headers = {'User-Agent': user_agent}r= requests.post(url, headers=headers)body=r.contentprint("访问"+request.url)return HtmlResponse(url, encoding='utf-8', status=200, body=body)#return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

关于 HtmlResponse HtmlRequest 可以参考http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/settings.html#topics-settings-ref  

(2)修改setting.py 文件 ,关闭默认下载器,添加新的下载器中间件

#取消默认的useragent,使用新的useragent
DOWNLOADER_MIDDLEWARES = {'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,#关闭默认下载器'tutorial.JavaScriptMiddleware.JavaScriptMiddleware':543 #键为中间件类的路径,值为中间件的顺序
}

(3)分析

ok ,这样就可以了,但是由于phantomjs在下载中件中,渲染网页的同时会阻塞爬取。所以效率很低,可以参考后面的使用 scrapy-splash 来渲染页面。

scrapy 处理动态加载,使用phantomjs相关推荐

  1. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 参考文章: (1)关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 (2)https://www. ...

  2. 利用scrapy框架爬取动态加载的数据

    在爬取有些网站的是后,数据不一定全部是可视化界面的,当我们拖动滚动条时才会加载其他的数据,如果我们也想爬取这部分数据,就需要使用selenium模块,在scrapy里可以结合该模块修改返回对象 一.编 ...

  3. Scrapy + Selenium 实现模拟登录,获取页面动态加载数据

    本文是模拟登录某八同城招聘网站,然后获取一个招聘信息页面中的浏览人数. 直接上代码! 1. Scrapy 爬虫文件 import scrapyclass TestSpider(scrapy.Spide ...

  4. Python爬虫——利用PhantomJS下载动态加载图片

    在浏览网页过程中,我们会遇到一些让人心动的图片,这时我们需要将它保存在本地.一般我们用BeautifulSoup可以解析静态网页,但很多时候我们遇到的都是动态加载的图片,无法再利用urllib模块操作 ...

  5. scrapy html页面加载未完成,Scrapy与scrapy-splash框架快速加载js页面

    一.前言 我们在使用爬虫程序爬取网页时,一般对于静态页面的爬取是比较简单的,之前写过挺多的案例.但是对于使用js动态加载的页面如何爬取呢? 对于动态js页面的爬取有以下几种爬取的方式:通过seleni ...

  6. 处理页面动态加载数据

    一 selenium selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏 ...

  7. python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  8. 爬取通过ajax动态加载的页面(实时监控华尔街见闻资讯与快讯)

    学习了几天如何使用scrapy去爬取静态网站,今天尝试去爬取动态加载的网站.选取的网站是华尔街见闻,文中不会像往常一样大篇幅讲解每一步该如何做,而是探讨如何爬取. 在源代码中无法获得全部数据(有的根本 ...

  9. python翻页功能url不变_爬取Ajax动态加载和翻页时url不变的网页

    这两天投了一家公司的爬虫实习生,笔试题是完成一个爬虫的小需求.网站没有什么反爬的高级技巧.但是有非常常见的,并不是针对我们爬虫的,却让我们新手很难理解的ajax动态加载技术和乍一看不明白的翻页时不变的 ...

最新文章

  1. 2008台北英特尔信息技术峰会主题演讲精选-王文汉
  2. React开发(237):dva概念2state
  3. idea启动tomcat时蓝屏
  4. python dataframe批量将列名加后缀_Python中的dataframe对象如何用相同的列名堆叠两个表,并从行堆叠它们以形成一个表,Dataframe,将,具有,叠加,起来,上,组成...
  5. 理解SSD多盒-实时目标检测
  6. 2021年四川省副高考试成绩查询,2021年四川省教育考试院成绩查询登录入口
  7. python手册中文版-Python中文文档
  8. 新兴基金经理凯瑟琳·伍德ARKK基金在 2022 年初遭受新的打击
  9. Flutter 游戏引擎 flame
  10. 数字的世界——好神奇
  11. 小花梨的三角形--美登杯
  12. 【0095】mongo-c-driver-1.18.0编译安装提示libmongoc-1.0.so.0.0.0:undefined reference to `BIO_meth_set_create`
  13. powershell 编程_如何使用PowerShell以编程方式更改Visual Studio中的默认浏览器,并可能使自己陷入困境...
  14. 网上特工网络监控系统 v5.65 官网
  15. 解析STEM理念对机器人教育的启示
  16. 【计算机系统】程序人生-Hello’s P2P
  17. Linux重定向输出日志
  18. [经验教程]微信红包发出后对方未领可以撤回吗及微信红包多久不领会自动退回?
  19. POJ 1222 熄灯游戏
  20. 如何使用深度学习自动识别限速标志?这里有一份Keras和TensorFlow教程

热门文章

  1. php 设计模式系列,一看就懂系列之 php设计模式(一)-Go语言中文社区
  2. MYSQL常用查询函数
  3. java 冒泡算法_关于java中的冒泡算法
  4. python中凯撒密码_python实现凯撒密码、凯撒加解密算法
  5. php获取视频大小代码怎么写,利用php获得flv视频长度的实例代码
  6. tcpdump如何判断丢包_亿级规模的高可用微服务系统,如何轻松设计?
  7. oracle xp 安装包资源
  8. 谷歌Chrome浏览器开发者工具教程—JS调试篇
  9. python split拆分字符串_python实现字符串完美拆分split()的方法
  10. mysql数据库电话号码类型,mySQL数据库一:数据类型