python3 scrapy 使用PhantomJS作为middlewares爬取动态加载的数据
来源:互联网 发布:java手册破解版下载 编辑:程序博客网 时间:2024/05/16 08:08
我们之前一直是获得url返回的数据并进行分析,取得其中需要的内容的
但是有些界面中的数据并不是在一开始就加载完成的,而是通过动态的加载出来的
假如我们有一天头脑发热,要爬取下面这个网址中的内容
https://www.jd.com/error2.aspx
不要问我为什么爬这个,只是举个栗子
然后按照以往的套路开始爬。。。想获取到这个名字
然后以为so easy ,开始自信满满写代码
分析界面的结构
瞬间写出下面的代码
# -*- coding: utf-8 -*-import scrapyclass MidSpider(scrapy.Spider): name = 'mid' start_urls = ['http:////wap.jd.com/category/all.html/'] def parse(self , response): for item in response.css(".mc"): title = item.css(".p-name a::text").extract() print(title)
然后开始跑爬虫
说好的数据去哪了。。。
然后怀疑人生几秒
是不是选择器出问题了,于是开始改,疯狂改。。。。
打印一下response.body.decode()
print(response.body.decode())
打印出来的response.body里居然没有自己需要的信息
发现
。。。
。。。
居然是不一样的
也就是说class=”w” 的div标签及其内容是在我们请求数据的时候是没有的
。。
然后突然发现
刷新界面的时候一瞬间是这样的
果然和我想的一样
没有办法得到数据了,GG 本篇博客结束
。
。
。
。
。
。
。
当然不是这样了
我们可以使用middleware(中间件)来预加载一下这个界面,获得完整的界面html之后,再取它里面的内容
我们在spiders的同级目录下建一个文件夹,叫做middle
然后在它的下面建一个py文件 myMiddleware.py
在myMiddleware.py文件夹中加入以下内容
from selenium import webdriverfrom scrapy.http import HtmlResponseimport timeclass JavaScriptMiddleware(object): def process_request(self, request, spider): if spider.name == "mid": driver = webdriver.Chrome("D:\\浏览器代理\chromedriver.exe") #指定使用的浏览器 driver.get(request.url) time.sleep(1) js = "var q=document.documentElement.scrollTop=10000" driver.execute_script(js) #可执行js,模仿用户操作。此处为将页面拉至最底端。 time.sleep(3) body = driver.page_source print ("访问"+request.url) return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request) else: return None
selenium 是一个 自动化测试的工具,如果你没有这个模块的话可以pip安装一下
pip install selenium
解释一下上面的代码
定义一个JavaScriptMiddleware的类,
定义一个process_request(self, request, spider):的方法
当spider的名字是mid的时候执行。
webdriver是什么呢?
是selenium为我们提供的自动化测试工具,
ctrl+左键查看一下
可以使用很多浏览器进行测试
在这里我们使用两个:
Chrome 和 PhantomJS
这里是我放在网盘里的链接,需要的话可以下载一下
链接:http://pan.baidu.com/s/1nv1fYBZ 密码:jokg
下载之后放进一个文件夹待用。
将路径配置一下
定义一个driver 来接收webdriver.Chrome(“D:\浏览器代理\chromedriver.exe”)。
这里需要注意的是D:\\ 是有两个“\”的,
js = "var q=document.documentElement.scrollTop=10000"
这段js代码是模拟浏览界面,将界面活动到距离顶部10000的位置,也就是滑动到界面最下方
剩下的代码应该没什么问题了
想要使用我们自定义的middleware需要在settings.py文件内配置一下,在settings.py文件下配置
DOWNLOADER_MIDDLEWARES = { 'xxx.middle.myMiddleware.JavaScriptMiddleware':100 ,}
调用一下我们自定义的middlewares
然后运行代码会弹出一个界面
自动测试,几秒后自动关闭,
命令行界面中出现结果
成功~
如果不想弹出这个界面的或,可以使用没有界面的PhantomJS作为测试,只需要修改一行代码
driver = webdriver.PhantomJS("D:\\浏览器代理\phantomjs.exe") #指定使用的浏览器
再次运行,等待运行结束后,同样出现结果~
这就是PhantomJS作为middlewares的应用~
项目代码和chromedriver PhantomJS我都放到了github上
https://github.com/dangsh/hive/tree/master/scrapySpider/xxx
https://github.com/dangsh/hive/tree/master/scrapySpider/%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BB%A3%E7%90%86
也可以在这个在git上下载
- python3 scrapy 使用PhantomJS作为middlewares爬取动态加载的数据
- Scrapy+phantomjs爬取动态网页数据
- scrapy 处理动态加载,使用phantomjs
- 基于Python3的phantomJs+Selenium动态网页爬取技术
- Scrapy--使用phantomjs爬取花瓣网图片
- python+selenium+PhantomJS爬取网页动态加载内容
- [Python爬虫]Scrapy配合Selenium和PhantomJS爬取动态网页
- Node.js 动态网页爬取 PhantomJS 使用入门
- 使用Scrapy爬取一个网站的数据
- 使用Scrapy爬取股票数据
- 使用 phantomjs 异步爬取 ajax 网页数据
- scrapy爬取post的数据
- selenium+ phantomjs实现动态网页爬取
- selenium+ Phantomjs爬取动态网页
- Selenium + phantomJS 爬取动态网站
- 使用python3爬取数据至csv
- 使用python3爬取数据至mysql
- Scrapy+PhantomJS+Selenium动态爬虫
- 【C++】复制构造函数(拷贝构造函数)和=运算符重载使用的区别
- hustoj的一些改动
- 集合(三)————list集合的子类
- Python入门学习第一天_2017.11.24
- 给服务器装linux系统
- python3 scrapy 使用PhantomJS作为middlewares爬取动态加载的数据
- Android7.1 GUI系统中的本地窗口(二)
- spring MVC原理图
- Springboot启动
- 2018届各大互联网公司校招薪资汇总表下载
- 【nachos】山东大学操作系统课设实验nachos系统(6)系统调用Exec()和Exit()
- CSDN博客使用方法
- MacOS下连接虚拟机(CentOS)
- 计蒜客_A. Amsterdam Distance_思维